2016-03-04 67 views
3

shell命令在我的终端,如果我跑:echo $(pwd),我/home/abr/workspace,但是当我试图运行此脚本在Python这样的:无法运行与子

>>> import subprocess 
>>> cmd = ['echo', '$(pwd)'] 
>>> subprocess.check_output(cmd, shell=True) 

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

+1

为什么你会这样做而不是使用os包?似乎使用内置函数更容易,而不是依赖几乎肯定是os/privilege/system/configuration/terminal依赖的外部调用。 os.path.abspath(os.path.curdir)似乎很简单 –

+0

如果您将鼠标悬停在问题文本下的[tag:subprocess]上;你应该看到标签的描述。点击说明下的“info”链接。 [我收集了一些又一次被问及的问题。如果你研究这些问题;您可能会避免将来使用'subprocess'模块时的常见问题](http://stackoverflow.com/tags/subprocess/info)。 – jfs

回答

1

使用os包:

import os 
print os.environ.get('PWD', '') 
1

试试这个:

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

subprocess文档它指定cmd应该是一个字符串shell=True时。
从文档:

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


一种更好的方式实现这一目标是可能使用os模块从Python标准库,就像这样:

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

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

+0

这是正确的。如果你认为它增加了任何东西,我会考虑添加python已经建立了更好的替代方案,或者引用子进程上的文档:“但是,请注意Python本身提供了许多类似shell的功能的实现” –

+0

@msn请考虑点击复选标记有助于接受答案。 – Forge

1

subprocess模块上的文档:

如果args是一个序列中,第一项指定的命令串,并 任何其他项将被视为附加的参数 外壳本身。

你想:

subprocess.check_output("echo $(pwd)", shell=True) 
1

命令subpreocess.check_output将返回命令的输出,你在呼唤: 例子:

#echo 2 
2 
蟒蛇

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

'\ n'包含在内这是命令的作用,它打印输出sting,然后将电流放在一个新的行。

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

subprocess.check_output(['pwd']) 

将返回当前目录+“\ n”

就我个人而言,我也很难理解你正在尝试做的,但我希望这有助于解决这个问题。