当前位置: 首页 > 面试题库 >

如何使用Python Popen做多个参数?

叶英哲
2023-03-14
问题内容

我正在尝试制作一个带有按钮的PyGtk Gui。当用户按下此按钮时,gnome-terminal提示用户输入密码。

然后,它将为JQuery代码段克隆此Git存储库gedit

然后,将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

问题答案:

要直接回答您的问题,请阅读以下内容。但是您的程序存在很多问题,我在“更好的实践”中介绍了其中的一些问题。

默认情况下,subprocess.Popen命令以字符串列表形式提供。

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

没有:

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

是:

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

这两个选项之间存在许多差异,并且每个选项都有有效的用例。我不会尝试总结差异-
这些Popen文档已经做得很好。

因此,对于您的命令,您将执行以下操作:

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作为许多系统命令的包装并不是一个好主意。至少,您应该将命令分解为单独的Popens,以便可以适当地处理非零退出。实际上,此脚本似乎更适合作为Shell脚本。但是,如果您坚持使用Python,则有更好的做法。

os模块应代替对rm和的调用cp。虽然我没有经验,但您可能希望查看类似GitPython的工具来与Git存储库进行交互。

兼容性问题

最后,您应谨慎拨打gnome-terminalsudo。并非所有的GNU /
Linux用户都运行Ubuntu,也不是每个人都拥有sudo或安装了GNOME终端模拟器。在当前形式下,如果发生以下情况,您的脚本将崩溃,但无济于事:

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

如果您愿意假设您的用户正在运行Ubuntu,则调用x-terminal-emulatorgnome- terminal直接调用要好得多,因为它可以调用他们安装的任何终端模拟器(例如xfce4-terminal,对于Xubuntu用户)。



 类似资料:
  • 问题内容: 假设单击了超链接,并使用以下参数列表触发了。现在如何中捕获所有使用的参数? 我的要求是我必须捕获所有参数并将它们放在地图中。 请帮忙! 问题答案: 你可以按上述方式使用RequestParam。

  • 假设单击了一个超链接,并使用以下参数list激发了一个url。现在如何在spring MVC中使用捕获所有参数? 我的要求是我必须捕获所有的参数,并将它们放在一个地图中。

  • 问题内容: 使用jinja2 url_for()功能时出现问题。 我有一条这样的路线: 在jinja模板文件中,我想创建一个链接到article_page的URL,所以我这样写: 但是当我运行此页面时,出现错误: 似乎缺少第二个参数。如何正确使用多个参数? 问题答案: 根据文件: 如果查询参数的值为“无”,则将跳过整个对。 确保不是。 或在函数中指定默认值。

  • 问题内容: 我想将页脚放在页面底部。我尝试这个 但是我的页脚变得凌乱。我的网站是用WordPress制作的。如果可能的话,我不想使用任何插件。我只想使用纯CSS。 这是CSS脚本 问题答案: 从不再可用的在线来源(无效链接)实施一种干净的方法之后,您的页面所需的最低代码将为(请注意-可能最好使用而不是`footer

  • 问题内容: 我使用React 15.0.2和React Router 2.4.0。我想将多个参数传递给我的路线,但我不确定如何以最佳方式做到这一点: 想要的是这样的: 问题答案: 正如@ alexander-t所提到的: 如果要将它们保留为可选: React Router v4与v1-v3不同,并且可选的路径参数未在文档中明确定义。 而是指示您定义path-to-regexp可以理解的路径参数。这

  • 我有一个使用FastAPI部署的机器学习模型,但问题是我需要该模型采用两体参数 当我试图发送输入参数时,我在邮递员中遇到了一个错误,请参见下面的图片,