如何使用Python Popen实现多个参数?

2024-06-10 12:39:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个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

Tags: git命令shareusrjssudopluginsxml
1条回答
网友
1楼 · 发布于 2024-06-10 12:39:36

要直接回答你的问题,请阅读下面的内容。但是你的程序有很多问题,我在“更好的实践”中谈到了其中的一些


默认情况下,^{}命令作为字符串列表提供。

但是,您也可以使用shell参数执行一个命令,该命令的格式与在shell提示符下键入时完全相同

否:

>>> p = Popen("cat -n file1 file2")

是:

>>> p = Popen("cat -n file1 file2", shell=True)
>>> p = Popen(["cat", "-n", "file1", "file2"])

这两个选项和每个选项的有效用例之间有很多不同。我不会试图总结这些区别,^{} docs已经做得很好了。


所以,对于您的命令,您可以这样做:

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)

更好的实践

然而,使用Python作为许多系统命令的包装器并不是一个好主意。至少,您应该将命令分解为单独的popen,以便能够充分处理非零出口。实际上,这个脚本看起来更适合作为shell脚本。但如果坚持使用Python,就有更好的实践。

应该用^{} module代替对rmcp的调用。虽然我没有这方面的经验,但您可能希望查看像GitPython这样的工具来与Git存储库交互。

兼容性问题

最后,在调用gnome-terminalsudo时应该小心。不是所有的GNU/Linux用户都运行Ubuntu,也不是每个人都安装了sudo,或者GNOME终端模拟器。在当前的形式下,如果出现以下情况,脚本将崩溃,而不是无用的:

  • 未安装sudo命令
  • 用户不在sudoers组中
  • 用户不使用GNOME或其默认的终端模拟器
  • 未安装Git

如果您愿意假设您的用户正在运行Ubuntu,那么直接调用x-terminal-emulator比直接调用gnome-terminal要好得多,因为它将调用他们安装的任何终端模拟器(例如,Xubuntu用户的xfce4-terminal)。

相关问题 更多 >