python - Python subprocess.call 使用 linux 源命令引发 OSError
问题描述
在 python2.7 中,我们可以使用 subprocess 包执行外部 linux 命令。
import subprocess
subprocess.call(["ls", "-l"]) // or
subprocess.call("ls -l".split())
两者都有效。我在当前工作目录中有一个文件 test.sh,其中只包含
date
所以我尝试了
>>> subprocess.call("pwd".split())
/home/ckim
0
>>> subprocess.call("cat test.sh".split())
date
0
>>> subprocess.call("source test.sh".split())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 523, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1343, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
怎么了?
ADD(ANSWER):这个问题和答案有足够的信息(但我会在这里留下我的问题..)从 subprocess.Popen 调用“源”命令
解决方案
source
是一个 shell 内置命令。提供Python 的子进程模块来生成新进程,而不是运行适当的 Bourne shell(或 zsh 或 ksh 等)。您不能从subprocess.call
.
要确定您是否可以使用模块运行特定命令subprocess
,您可能需要使用which
来获取有关您需要使用的命令的信息:
user@machine: ~
$ which source [7:41:38]
source: shell built-in command
user@machine: ~
$ which cat [7:41:42]
/bin/cat
user@machine: ~
$ which ls [7:41:47]
ls: aliased to ls --color=tty
推荐阅读
- docker - Docker 错误:没有这样的容器:路径 .. 尝试复制到本地驱动器时
- r - rjdbc dbSendUpdate ORA-12899 值对于列来说太大
- python - 使用 JSON 的原子 Redis 操作
- r - 任何人都可以帮我解释我在将 tensorflow 用于神经网络时获得的这些图表吗?
- docker - 如何通过变量扩展将参数传递给 ENTRYPOINT?
- python - 火炬:最小填充张量,使得 num 元素可被 x 整除
- android - 如何使用 Google Classroom API 访问 Classroom Course Stream
- unity3d - 更改我的 mac 后在 Unity 中看不到我的项目
- c++ - 检查图连通性的程序会产生分段错误
- c# - xUnit 并行测试集合