如何使用 Python Popen 执行多个参数?

2024-03-05

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

然后它会克隆这个Git 存储库 https://github.com/pererinha/gedit-snippet-jquery for geditJQuery 片段。

然后,它复制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

它在我的终端上运行良好。

But,通过 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 https://docs.python.org/2/library/subprocess.html#subprocess.Popen命令以字符串列表的形式提供。

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

No:

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

Yes:

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

这两个选项之间存在许多差异,并且每个选项都有有效的用例。我不会尝试总结差异 -Popen docs https://docs.python.org/2/library/subprocess.html#subprocess.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 作为许多系统命令的包装器并不是一个好主意。至少,您应该将命令分解为单独的 Popen,以便可以充分处理非零退出。事实上,这个脚本似乎更适合作为 shell 脚本。但如果你坚持使用 Python,还有更好的实践。

The os module http://docs.python.org/library/os.html应该取代调用rm and cp。虽然我没有这方面的经验,但你可能想看看像这样的工具GitPython http://gitorious.org/git-python与 Git 存储库交互。

兼容性问题

最后,拨打电话时应小心gnome-terminal and sudo。并非所有 GNU/Linux 用户都运行 Ubuntu,也不是每个人都运行 Ubuntusudo,或安装的 GNOME 终端模拟器。在目前的形式下,如果出现以下情况,您的脚本将会崩溃,而且毫无帮助:

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

如果您愿意假设您的用户正在运行 Ubuntu,请致电x-terminal-emulator是比打电话更好的选择gnome-terminal直接,因为它将调用他们安装的任何终端模拟器(例如xfce4-terminal对于 Xubuntu 用户)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Python Popen 执行多个参数? 的相关文章

随机推荐

  • 半透明 JFrame 边框

    我想让 JFrame 边框透明 所以我尝试使用我自己的 Border 类来做到这一点 private class ShadowBorder extends AbstractBorder private static final int RA
  • Java 中字符串(非结构化数据)的 K 最近邻实现

    我正在寻找 Java 中针对非结构化数据的 K 最近邻算法的实现 我发现了许多数字数据的实现 但是我如何实现它并计算文本 字符串 的欧几里得距离 以下是 double 的一个示例 public static double Euclidean
  • Python:如何使用 OpenCV 从网络摄像头捕获图像

    我想使用 OpenCV 从网络摄像头捕获并保存大量图像 这是我目前的代码 import cv2 camera cv2 VideoCapture 0 for i in range 10 return value image camera re
  • React Native导航组件路由问题

    新的反应本机用户在这里 我遇到了问题 不知道如何继续 我能够正确运行反应导航 然后开始收到错误 路由组件必须是 React 组件 但除非我遗漏了某些内容 否则我相信我引用的组件is一个反应组件 请参阅下面的 index android js
  • 如何转义 Ansible YAML 文件中字符串中的冒号?

    我想在安装过程中更改文件 var www kibana config js 中的一行代码 elasticsearch http window location hostname 9200 to elasticsearch http 192
  • Shell 脚本用户提示/输入

    这是别人写的一个粗略的 korn shell 脚本 我对使用 shell 语法不太了解 我什至不确定这是否可行 有什么方法可以让我运行这个文件并提示输入日期 这样我就不必每次都手动进入脚本并更改它 例如 我想将 1 12 09 替换为从用户
  • Qt:将变量传递给子项目

    我的项目的结构如下 Proj Proj pro subProj subProj pro subsubProj subsubProj pro 有没有一种方法可以在 subProj pro 中实例化全局变量并调用它 例如subsubProj p
  • Scala双重定义(2个方法具有相同的类型擦除)

    我用 scala 编写了这个 但它无法编译 class TestDoubleDef def foo p List String def foo p List Int 编译器通知 error double definition error m
  • .Net WikiText 到 HTML 解析器 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道 我知道 这听起来很愚蠢 但似乎没有开源强大的 NET 库可以将 Wikitext 解析为 HT
  • Python、Numpy、OpenCV——创建修改后的(同样快的)“addWeighted”函数

    我正在用 python 编写一个程序 该程序使用的函数与addWeightedopenCV 中的函数 不同之处在于 它实际上并不添加表示图像的 numpy 数组 而是采用在任何特定坐标处更亮的像素并使用该值 然而 我发现 尽管这些函数做的事
  • 有没有办法在 Azure Static Web App 中查看文件?

    有没有办法使用Azure Portal查看上传到Azure Static Web App的文件 我需要检查一些项目 我可以在 DevOps Repo 中看到该文件 但想确认它位于 Azure Static Web App 中的正确文件夹结构
  • 如何将参数发送到前置过滤器?

    我想在我的应用程序控制器中创建一个 before filter 方法 如下所示 def check role role name unless logged in user has role role name flash notice A
  • 伪造 HTTP 请求响应以在 Android 中进行测试

    我正在编写一个 Android 应用程序 有时需要通过 HTTP 从 REST API 请求数据 我正在使用 Apache DefaultHttpClient 来执行请求 有没有办法为此应用程序编写测试并在运行测试时 替换 DefaultH
  • 迭代前默认选择 Angular 设置下拉选择选项

    我有一个选择下拉菜单 并从列表中迭代选项 我试图设置为选定的单独选项 作为默认值 以防用户未选择值 以下是我尝试实现的方法
  • 在 XCode 中找不到应用程序证明功能

    根据 App Check Firebase 文档 据说可以将 App Attest 功能添加到您的应用程序中 但是 我在 XCode 中找不到任何此类功能 对此有什么见解吗 注意 我们已在配置文件中启用功能 文档链接 https fireb
  • 当通过开发工具查看时,Selenium WebDriver 无法找到页面源中不存在但 HTML 中存在的元素

    我正在使用 Selenium Web Driver HtmlUnitDriver 来搜索网页上的元素 我只能搜索页面源中可见的那些元素 不过 我可以使用 Internet Explorer 开发人员工具 F12 查看这些元素的详细信息 当我
  • 无法为字符串生成正则表达式

    我有一根绳子abc 123 243 xyz 432 567 我想生成一个与特定字符串匹配的正则表达式 应根据以下示例和具体结果来测试正则表达式 Exp 1 abc 123 234 xyz 432 567 123存在于 123 243 结果
  • 使用 jQuery 隐藏本机工具提示

    当用户将鼠标悬停在具有标题属性的锚标记上时 是否有办法隐藏本机工具提示操作 我不想删除它 只是不显示默认工具提示操作的令人讨厌的黄色框 UPDATE 在阅读了其他几篇文章后 我认为我无法隐藏本机工具提示操作的标题属性 但我试图跳出框框思考
  • UITextField 不会成为FirstResponder

    我在让文本字段接受成为FirstResponder 指令时遇到问题 我提供了一种自定义机制来在导航栏中创建标题 我有另一个视图控制器成功地使用了相同的技术 在 viewDidAppear 上我触发 void addTitleTextFiel
  • 如何使用 Python Popen 执行多个参数?

    我正在尝试制作一个带有按钮的 PyGtk Gui 当用户按下这个按钮时 gnome terminal提示用户写入密码 然后它会克隆这个Git 存储库 https github com pererinha gedit snippet jque