无法使用subprocess运行shell命令

3
在我的终端中,如果我运行 echo $(pwd) 命令,会得到 /home/abr/workspace 的输出。但当我尝试像这样在 Python 中运行该脚本时:
>>> import subprocess
>>> cmd = ['echo', '$(pwd)']
>>> subprocess.check_output(cmd, shell=True)

我得到了 '\n'。如何解决这个问题?


1
为什么要这样做,而不是使用os包呢?使用内置函数似乎更容易,而不是依赖于几乎肯定与os/权限/系统/配置/终端有关的外部调用。os.path.abspath(os.path.curdir)看起来足够简单。 - en_Knight
如果你将鼠标悬停在问题文本下方的 [tag:subprocess] 上,你应该会看到标签的描述。点击描述下方的 info 链接。我已经收集了那里反复问过的问题。如果你学习这些问题,你可能会避免在未来使用 subprocess 模块时遇到常见问题。 - jfs
4个回答

1

subprocess.check_output 命令将返回您调用的命令的输出:

示例:

#echo 2
2

来自Python

>>>subprocess.check_output(['echo', '2'], shell=True)
>>>'2\n'

'\n'被包含在内是因为该命令会打印输出字符串并将当前行放置在新行中。

现在回到你的问题;假设你想要'PWD'的输出,首先你需要摆脱shell。如果你提供了shell参数,命令将在shell环境中运行,你将看不到返回的字符串。

subprocess.check_output(['pwd'])

将返回当前目录 + '\n'

个人而言,我很难理解你想做什么,但希望这能帮助解决问题。


1
使用 os 包:
import os
print os.environ.get('PWD', '')

1

试试这个:

cmd = 'echo $(pwd)'
subprocess.check_output(cmd, shell=True)

subprocess文档中指定,当shell=True时,cmd应为字符串。
来自文档:

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


更好的方法可能是使用Python标准库中的os模块,像这样:

import os
print os.getcwd()
>> "/home/abr/workspace"

getcwd()函数返回一个表示当前工作目录的字符串。


这是正确的。如果您认为有必要,我建议添加Python内置的更好的替代方案,或者引用subprocess文档中的内容:“但请注意,Python本身提供了许多类似于shell的功能的实现”。 - en_Knight
@msn请考虑通过点击勾号接受答案,如果它对您有帮助。 - Forge

1
subprocess模块的文档中得知:
如果args是一个序列,第一项将指定命令字符串,任何其他项都将被视为shell本身的附加参数。
你需要:
subprocess.check_output("echo $(pwd)", shell=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接