理解 python subprocess.check_output 的第一个参数和 shell=True [重复]

2023-12-29

我对如何正确使用 Python 的 subprocess 模块感到困惑,特别是 check_output 方法的第一个参数和shell选项。查看下面交互式提示的输出。我将第一个参数作为列表传递,并取决于是否shell=True设置后,我得到不同的输出。有人可以解释这是为什么以及输出的输出吗?

>>> import subprocess
>>> subprocess.check_output(["echo", "Hello World!"])
'Hello World!\n'
>>> subprocess.check_output(["echo", "Hello World!"], shell=True)
'\n'

现在,当我将第一个参数作为简单字符串而不是列表传递时,我得到了这个令人讨厌的堆栈跟踪。这是为什么?这是怎么回事?

>>> subprocess.check_output("echo Hello World!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 537, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

但是,当我打开 shell=True 时,它​​就可以正常工作:

>>> subprocess.check_output("echo Hello World!", shell=True)
'Hello World!\n'

所以我有点困惑,当第一个参数在列表中而没有时它就起作用shell=True然后作为一个简单的字符串使用shell=True。我不明白什么shell=True以及将第一个参数作为列表与字符串传递之间的区别。


从文档Popen http://docs.python.org/2/library/subprocess.html#subprocess.Popen:

shell 参数(默认为False) 指定是否使用 shell 作为要执行的程序。如果外壳是True, 这是 建议通过args作为字符串而不是序列。

在 Unix 上shell=True,外壳默认为/bin/sh. 如果 args 是 string,字符串指定通过shell执行的命令。 这意味着字符串的格式必须与原来的格式完全相同 在 shell 提示符下键入时。例如,这包括引用或 反斜杠转义其中包含空格的文件名。如果 args 是 序列,第一项指定命令字符串,以及任何 附加项目将被视为 shell 的附加参数 本身。也就是说,Popen相当于:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

在 Windows 上shell=True,COMSPEC 环境变量指定 默认外壳。您唯一需要指定的时间shell=True在 Windows 是当你想要执行的命令被内置到 外壳(例如dir or copy)。你不需要shell=True运行一批 文件或基于控制台的可执行文件。

就你而言,自从echo是启动时内置的 shellshell=True,如果你想将参数传递给echo命令你must将命令写为字符串或传递具有以下内容的序列whole命令作为字符串作为第一个元素。序列的其他元素作为参数传递到外壳,而不是您正在调用的命令。

In some OSes echo is also一个程序(通常/bin/echo)。这解释了为什么您的第一个示例没有引发异常但输出'\n'而不是预期的'Hello, World!\n': the /bin/echo命令在没有参数的情况下执行,因为参数被 shell“消耗”。

调用时出现错误:

subprocess.check_output("echo Hello World!")

是因为自从你这样做以来not use shell=True, python 正在尝试执行该程序echo Hello World!即一个名为echo<space>Hello<space>World!. It is一个有效的程序名称,但没有具有该名称的程序,因此出现异常。

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

理解 python subprocess.check_output 的第一个参数和 shell=True [重复] 的相关文章

随机推荐

  • REST API 的试运行策略

    我正在寻找 REST API 的 试运行 操作的一些最佳实践 假设我有一个端点将资金从账户 A 转账到账户 B 我可以像这样发起转账 POST transactions amount 1000 how much to transfer so
  • jQuery 数据绑定 - 现在流行的插件是什么?

    我需要某种类型的 JS MVC DataBinding 解决方案 与实施 GMAIL Web 应用程序类似 消息索引和消息显示 在消息显示的位置 如果您修改消息 它会自动在消息索引中更新 我应该学习什么插件才能在不使用大量 jQuery 的
  • Tensorflow 中的入队和增量变量

    如何使张量流图将递 增的数字推送到队列 我这样做只是为了学习目的 所以我希望您保持它与我正在做的事情相似 并纠正我做错的事情 这是我的代码 import tensorflow as tf create queue queue tf Rand
  • 通过 attr_accessor 对模型对象进行排序

    当我必须对对象列表进行排序时 我认为 attr accessor 具有与另一个相同的行为 但似乎有所不同 dataRecords MyData where day Time now yesterday strftime Y m d to i
  • 仅禁用自动生成的表单上的特定“绿色加号”图标

    如何在自动生成的表单中禁用特定 manytomany 或 foreignkey 字段上的绿色图标 使用CSS如下 add another display none 禁用所有我不想要的 一个例子是工作日模型 存储从星期一到星期日的天数 指向该
  • Python 的多处理和内存

    我在用multiprocessing imap unordered对值列表执行计算 def process parallel fnc some list pool multiprocessing Pool for result in poo
  • 来自 Cordova iOS 插件的后续回调不会触发

    我在从 cordova 插件 iOS 插件 立即触发后续回调时遇到麻烦 在 XCode 调试器中 我清楚地看到它跳过了 self commandDelegate sendPluginResult pluginResult callbackI
  • ORA-01036: 通过 C# 运行查询时非法变量名称/编号

    我正在尝试使用ALTER USER在以下代码中 使用 C 中的 OracleCommand 查询 Oracle 数据库 如果用户名和密码的值不是空字符串 它将创建查询 但我收到一个错误 ORA 01036 illegal variable
  • 与带有分隔符的 String.Split 相反 (.net)

    有没有办法做相反的事情String Split在 Net 中 也就是说 用给定的分隔符组合数组的所有元素 Taking a b c 和给予 a b c 带有分隔符 UPDATE 我自己找到了答案 它是String Join method 找
  • 从 MS Excel 访问 Redis?

    我想使用 Redis 从命令行 脚本 Web 和电子表格中查询数据 除了电子表格之外 我可以找到很好的例子 不过 我不太知道从哪里开始访问 MS Excel 电子表格 谷歌让我失望了 请让我知道您建议如何执行此操作 谢谢 附注对于那些不熟悉
  • Spring MVC 请求映射

    我正处于学习使用 Spring MVC 的早期阶段 我创建了一个控制器并应用了RequestMapping对其进行注释 当我运行该项目时 索引页面按预期显示index htm 但是当我导航到应该指向我的控制器的 URI 时 我收到 404
  • 使用 HttpModule 进行本地化安全吗?

    我正在考虑使用 HttpModule 进行本地化 基于中的示例 本文 http weblogs manas com ar smedina 2008 12 17 internationalization in aspnet mvc 但我很好奇
  • Boost Beast 异步 Websocket 服务器 如何与会话交互?

    所以我不知道为什么 但我无法理解 boost Beast websocket 服务器以及如何 或应该 与其交互 我制作的基本程序看起来像这样 跨 2 个类 WebSocketListener and WebSocketSession htt
  • Java(Web 服务 - SOAP)- 如何在客户端添加 SOAP 处理程序并正确启用 MTOM?

    Java JDK 1 6 0 7 WSGEN 版本 JAX WS RI 2 2 3 b01 我有以下问题 SOAPBinding binding SOAPBinding BindingProvider port getBinding bin
  • 是否可以在 GitHub 上搜索特定文件名?

    我知道 GitHub Web 界面可让您在所有存储库中搜索具有特定路径名的文件 例如搜索path app models user rb产生 gt 109k 结果 但是有没有一种方法可以在所有存储库中搜索独立于其子目录位置的文件名 我尝试在中
  • 查看文件是否为空[重复]

    这个问题在这里已经有答案了 可能的重复 在 Windows 上用 Java 检查文件是否为空的最有效方法 https stackoverflow com questions 7190618 most efficient way to che
  • Gradle 测试任务不运行带有 @Category 和 @RunWith 注释的 JUnit 测试

    Gradle 不使用 Category 和 RunWith 注释运行我的 JUnit 测试 Java 8 Gradle 4 2 1 我的 JUnit 类 public interface FastTest Category FastTest
  • 无法在Rails测试环境中使用TimescaleDB

    我被困在 Rails 中使用 TimescaleDB 开发中一切正常 但在我的测试套件中我无法插入任何数据 我尝试过的 A 使用 SQL 模式转储 这导致了我看到的原始错误消息 它确实为 TimescaleDB 创建了部分架构 但不是全部
  • 删除多余的空格,但使用 C# 中的正则表达式保留新行[重复]

    这个问题在这里已经有答案了 我正在使用这个正则表达式 Regex Replace value Trim s 将多余的空间修剪并最小化为一个空间 问题是它也删除新行从文字来看 如何修复正则表达式以保留新行 排除 CRLF S r n 在空白类
  • 理解 python subprocess.check_output 的第一个参数和 shell=True [重复]

    这个问题在这里已经有答案了 我对如何正确使用 Python 的 subprocess 模块感到困惑 特别是 check output 方法的第一个参数和shell选项 查看下面交互式提示的输出 我将第一个参数作为列表传递 并取决于是否she