我正在尝试制作一个PyGtk Gui,它有一个按钮。当用户按下此按钮时,gnome-terminal
提示用户输入密码。
然后它将为JQuery片段克隆这个Git repository。
然后,它将js.xml
文件复制到/usr/share/gedit/plugins/snippets/js.xml
最后,它强制删除Git存储库。
命令:
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
在我的候机楼工作得很好。
但是,通过它刚刚打开的GUI,我添加密码,按enter,然后它再次关闭。
我只想运行命令到第一个&&
这是我的Python函数(带命令):
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
要直接回答你的问题,请阅读下面的内容。但是你的程序有很多问题,我在“更好的实践”中谈到了其中的一些
默认情况下,^{} 命令作为字符串列表提供。
但是,您也可以使用
shell
参数执行一个命令,该命令的格式与在shell提示符下键入时完全相同否:
是:
这两个选项和每个选项的有效用例之间有很多不同。我不会试图总结这些区别,^{} docs 已经做得很好了。
所以,对于您的命令,您可以这样做:
更好的实践
然而,使用Python作为许多系统命令的包装器并不是一个好主意。至少,您应该将命令分解为单独的popen,以便能够充分处理非零出口。实际上,这个脚本看起来更适合作为shell脚本。但如果坚持使用Python,就有更好的实践。
应该用^{} module 代替对
rm
和cp
的调用。虽然我没有这方面的经验,但您可能希望查看像GitPython这样的工具来与Git存储库交互。兼容性问题
最后,在调用
gnome-terminal
和sudo
时应该小心。不是所有的GNU/Linux用户都运行Ubuntu,也不是每个人都安装了sudo
,或者GNOME终端模拟器。在当前的形式下,如果出现以下情况,脚本将崩溃,而不是无用的:sudo
命令sudoers
组中如果您愿意假设您的用户正在运行Ubuntu,那么直接调用
x-terminal-emulator
比直接调用gnome-terminal
要好得多,因为它将调用他们安装的任何终端模拟器(例如,Xubuntu用户的xfce4-terminal
)。相关问题 更多 >
编程相关推荐