I am trying to make a PyGtk Gui, that has a button. When the user presses this button, gnome-terminal prompts the user to write their password.
Then it will clone this Git repository for gedit JQuery snippets.
And then, it copies the js.xml file to /usr/share/gedit/plugins/snippets/js.xml
In the end, it forcefully removes the Git repository.
The command:
gnome-terminal -x sudo git clone git://github.com/pererinha/gedit-snippet-jquery.git && sudo cp -f gedit-snippet-jquery/js.xml /usr/share/gedit/plugins/snippets/js.xml && sudo rm -rf gedit-snippet-jquery
It works fine in my terminal.
But, via the GUI it just opens, I add my password, press enter, and then it closes again.
I’d like to only run the command to the first &&
This is my Python function (with command):
def on_install_jquery_code_snippet_for_gedit_activate(self, widget):
""" Install Jquery code snippet for Gedit. """
cmd="gnome-terminal -x sudo git clone git://github.com/pererinha/gedit-snippet-jquery.git && sudo cp -f gedit-snippet-jquery/js.xml /usr/share/gedit/plugins/snippets/js.xml && sudo rm -rf gedit-snippet-jquery"
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
close_fds=False)
self.status.set_text(p.stdout.read()) #show response in 'status
To directly answer your question, read below. But there’s a lot of problems with your program, some of which I cover in “Better practice.”
By default,
subprocess.Popencommands are supplied as a list of strings.However, you can also you can use the
shellargument to execute a command “formatted exactly as it would be when typed at the shell prompt.”No:
Yes:
There are a number of differences between these two options, and valid use cases for each. I won’t attempt to summarize the differences- the
Popendocs already do an excellent job of that.So, in the case of your commands, you’d do something like this:
Better practice
However, using Python as a wrapper for many system commands is not really a good idea. At the very least, you should be breaking up your commands into separate Popens, so that non-zero exits can be handled adequately. In reality, this script seems like it’d be much better suited as a shell script. But if you insist on Python, there are better practices.
The
osmodule should take the place of calls tormandcp. And while I have no experience with it, you might want to look at tools like GitPython to interact with Git repositories.Compatibility concerns
Lastly, you should be careful about making calls to
gnome-terminalandsudo. Not all GNU/Linux users run Ubuntu, and not everyone hassudo, or the GNOME terminal emulator installed. In its current form, your script will crash, rather unhelpfully, if:sudocommand is not installedsudoersgroupIf you’re willing to assume your users are running Ubuntu, calling
x-terminal-emulatoris a much better option than callinggnome-terminaldirectly, as it will call whatever terminal emulator they’ve installed (e.g.xfce4-terminalfor users of Xubuntu).