在参数中运行带引号的命令适用于commands.getoutput(),但不适用于子进程模块

2024-01-28

我正在创建一个 python 程序,它调用许多其他程序和脚本(在 Unix(SUNos) + Linux 上)。除了 1 个脚本之外,我在所有地方都使用子进程。

我不使用子进程的脚本是一个 perl 脚本,它已被制作成可执行文件。不知何故,它不允许我使用子进程,但它可以与(已弃用的)命令包一起使用。 我想了解为什么它不适用于子流程(换句话说:我做错了什么;-))

(实际的 perl 命令是什么并不重要,但它返回用户的全名和电子邮件作为结果)

我尝试过的:

PERL_CMD = [ '<executable perl-script>', '-rt', '"users"', '-eq', '"name"' '"<user_name>", '-fs', '":"', '-fld', '"fullname"', '"email"' ]
full_name, email = subprocess.check_output( PERL_CMD ).split(':')

但这是行不通的。

命令变体起作用的地方:

PERL_CMD = '<executable perl-script> -rt "users" -eq "name" "<user_name>" -fs ":" -fld "full_name" "email"'
full_name, email = commands.getoutput( PERL_CMD ).split(':')

有人知道为什么我无法让子流程工作吗?

令我烦恼的是,我可以让它适用于除此之外的所有事情(尽管我有一个可接受的(但已弃用的)解决方法)。


您在中使用语法引号commands.getoutput()案例,以及文字引号subprocess.check_output()案件。没有shell=True(你不应该使用),没有 shell 将引号解析为语法,因此除了作为语法的引号之外,不存在语法引号之类的东西Python 本身.

所以,只需取出"您注入参数中的内容:

# this contains quotes that are syntactic to Python only, and no literal quotes
perl_cmd = [
  '<executable perl-script>',
  '-rt', 'users',
  '-eq', 'name', '<user_name>',
  '-fs', ':',
  '-fld', 'fullname', 'email' ]

更详细地解释一下——

当你通过时"name"对于 shell 作为命令的一部分,引号是被壳本身消耗在其解析过程中,不作为参数传递给命令。因此,当你跑步时sh -c 'echo "hello"',这通过了完全相同的论点 to echo as sh -c 'echo hello'; the echo命令甚至无法区分两次调用之间的区别!

当你通过时'"hello"'作为一个论点subprocess.Popen(),相比之下,外部引号由 Python 使用,内部引号是作为文字传递给内部命令。这使得它相当于sh -c 'echo "\"hello\""'(同样将文字引号传递给echo), not sh -c 'echo "hello"'(事实并非如此)。

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

在参数中运行带引号的命令适用于commands.getoutput(),但不适用于子进程模块 的相关文章

随机推荐

  • 实体框架可以处理存储过程中的多个结果集(每个结果集来自连接表)吗?

    在 Linq to SQL 中 我找不到一种简单的方法来处理存储过程返回的多个结果集 其中每个结果集都来自表连接 每个结果集并不直接映射到表 无法改变这种行为 目前看来 使用 DataSet 似乎要简单得多 当前的实体框架或即将推出的实体框
  • 密封案例类是一个好习惯吗?

    密封类的主要原因似乎是 这允许编译器在这些类上进行模式匹配时进行穷举搜索 假设我有用于模式匹配的数据类型 玩具示例 sealed trait Statement case class Assign name String value Int
  • withFormik,将函数作为 props 传递

    我正在使用 Formik 构建用户输入表单 我正在使用 withFormik 来处理我的表单 我目前正在我的组件中传递我的handleSubmit 如下所示 export const CreateForm withFormik mapPro
  • 使用请求范围的 bean 函数作为 JSF 中临时呈现按钮的操作

    我在 JSF 中遇到以下基本 也许是愚蠢的 理解问题 有一个 JSF 页面 testPage xhtml
  • Django 启动时只执行一次代码?

    我正在编写一个 Django 中间件类 我只想在启动时执行一次 以初始化一些其他任意代码 我遵循了 sdolan 发布的非常好的解决方案here https stackoverflow com questions 3495964 in dj
  • 如何使用 Jquery 选择表行?

    我试图使用 JQuery 选择表行 但似乎不会触发 selected 事件 我已将代码放在 JSFiddle 上 http jsfiddle net tonymaloney1971 3tevxmps 1 http jsfiddle net
  • CIColor 到 UIColor -> 未为 UIColor UIExtendedSRGBColorSpace 定义 CIColor

    我正在尝试从 rgb hex 色彩空间实现 CIColor 如下所示 let bottomColor UIColor init red 235 255 green 250 255 blue 255 255 alpha 1 0 ciColor
  • 为什么 OrderedDict 不使用 super ?

    我们可以创建一个OrderedCounter简单地通过使用多重继承 gt gt gt from collections import Counter OrderedDict gt gt gt class OrderedCounter Cou
  • Rails 中两个表具有相同的数据?

    我正在尝试在我的视图中创建一个表并在某些条件下填充它 我有两个表 里面都有两列 一列称为event url另一个是gmiurl 里面有gmiurl的表叫做GMITable另一个叫做newevent 基本上我想展示里面的一切GMITable除
  • 设置 selectonemenu 的默认值

    我有一个像这样的选择菜单
  • APC 显示 100% 碎片

    APC http php net manual en book apc php显示 100 碎片 这很糟糕吗 这是否意味着它根本没有帮助 我应该采取哪些途径来改善情况 提前致谢 根据我的经验 是的 我的系统中 APC 显示 100 碎片 并
  • 按下 tkinter 按钮时如何播放声音?

    我正在为 Windows PC 构建一个程序 其中包含很多按钮并且看起来非常简单 所以我想知道 当你按下按钮 使用 tkinter 时 我可以播放声音来让程序活跃一点吗 请记住我正在学习 所以请简单一点 假设您的文件是 WAV from t
  • 实体类型没有定义键

    另一个 实体类型 x 没有定义键 问题 但我已经设置了 Key 属性上的属性所以我有点困惑 这是我的实体和上下文类 namespace DoctorDB Models public class Doctor Key public strin
  • gzip 无法在 Django 中使用 Whitenoise 工作

    我在 Heroku 上部署了一个 Django 网站 使用 Whitenoise 提供静态文件 静态文件工作正常 但根据我用来测试它的各种网站 包括谷歌工具 Gzip 无法工作 这是我的生产设置文件中的代码 DATABASES defaul
  • iPhone:通过蓝牙序列化和发送对象?

    序列化对象并通过蓝牙 或网络连接 发送它的最佳方法是什么 你可以使用gamekit http developer apple com library ios documentation NetworkingInternet Conceptu
  • 绘制从远程服务器下载的图像

    我需要执行以下操作 从服务器下载 PNG 资源 根据状态在该图像上绘制几个具有不同颜色的矩形 在可缩放图像视图中显示该图像 我在使用 Canvas 的 Android 应用程序中有一个工作代码 但我不知道如何使用 Flutter 来做到这一
  • Java中如何让程序等待按钮按下

    现在 我不确定这是否可能 甚至是完成我想要做的事情的最佳方法 但基本上我正在使用一个非常简单的 Swing GUI 创建一个非常简单的模拟程序 每轮模拟结束后 界面上的一些按钮都会启用 供用户进行更改 然后用户可以按 继续 按钮再次开始模拟
  • JPA 继承 - 更改实体类型

    我有两节课 Entity Inheritance strategy InheritanceType SINGLE TABLE DiscriminatorColumn name PERSONTYPE DiscriminatorValue va
  • 草皮遮罩返回没有洞的多边形

    我得到一些奇怪的结果草皮 mask https turfjs org docs mask 这是polygon我正在尝试运行mask 功能 https gist githubusercontent com Stophface 50155878
  • 在参数中运行带引号的命令适用于commands.getoutput(),但不适用于子进程模块

    我正在创建一个 python 程序 它调用许多其他程序和脚本 在 Unix SUNos Linux 上 除了 1 个脚本之外 我在所有地方都使用子进程 我不使用子进程的脚本是一个 perl 脚本 它已被制作成可执行文件 不知何故 它不允许我