Python子进程帮助 - 不能使用shell = true

时间:2016-10-19 15:41:51

标签: python linux python-2.7 shell subprocess

我在这里试图用python做一个简单的函数而不使用shell = true而且我没有得到我需要的结果。我在Linux上使用python 2.7。

我尝试过多种方法。如果我像这样使用shell = true,它工作正常:

import subprocess as s

var1 = s.call("echo $HOME", shell=True)

import subprocess as s

var1 = s.check_output("echo $HOME", shell=True)

都返回

/home/myhost

......就像它应该但我试过的其他一切都失败了。在大多数情况下,似乎它将我的变量作为字符串而不是命令传递。

这些是我收到的各种方法的结果:

import subprocess as s

print var1

返回

myhost@me:~/Desktop$ python home_test.py 
  File "home_test.py", line 42, in <module>
    main()
  File "home_test.py", line 11, in main
    my_test()
  File "home_test.py", line 16, in check_auth
    var1 = s.check_output("echo $HOME")
  File "/usr/lib/python2.7/subprocess.py", line 567, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  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

然后我尝试了这个:

import subprocess as s

var1 = s.Popen(['echo', '$HOME'], stdout=s.PIPE) 

print var1

返回

myhost@me:~/Desktop$ python home_test.py 
<subprocess.Popen object at 0x7f297ebcbf90>
myhost@me:~/Desktop$echo: write error: Broken pipe

然后这个:

import subprocess as s

cmd1 = '$HOME'
var1 = s.Popen(['/bin/echo', cmd1], stdout=s.PIPE)

print var1

返回

('$Home\n', None)

和这个

import subprocess as s

cmd1 = 'HOME'
var1 = s.Popen(['/bin/echo', cmd1], stdout=s.PIPE)
print var1

返回

myhost@me:~/Desktop$ python home_test.py 
('Home\n', None)

发现一些说使用操作系统的文档...也失败了,在发现它已经在2.6中被弃用后并不令人惊讶。

import os

var1 = os.popen('echo $HOME')
print var1

返回

<open file 'echo $HOME', mode 'r' at 0x7f1c6b26f6f0>
sh: echo: I/O error

然后是我的最后一次尝试(实际上还有更多......但我们会将其留在此处)

import subprocess as s

var1= s.Popen(["echo", "$HOME"], stdout=s.PIPE).communicate()[0] 

print var1

返回:

myhost@me:~/Desktop$ python home_test.py 
$HOME

有人可以指出我正确的方向吗?我花了整整一天摆弄这个,我需要帮助。提前感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:3)

让我们从答案开始

import os
home = os.environ['HOME']
print(home)

现在进行尝试和结果。您的主要问题(除了一些随机错误)是shell将$HOME替换为环境变量的值。没有shell参数,扩展$HOME只是一个字符串,这就是你得到的。

答案 1 :(得分:1)

听起来你真的只想获得环境变量的值。 os.getenv('HOME')应该为你做到这一点。

答案 2 :(得分:1)

提及os.environ['HOME']的答案是正确的,但它可能不是您想要的便携性。无法保证HOME已设置(按惯例设置,不是必需的;用户可以删除它,shell可以选择不设置它等)。如果你最终想要移植到Windows,那不是它的名字。如果您想要用户的主目录,请不要直接检查环境,而是使用os.path.expanduser来使用更智能的主目录查找逻辑:

import os.path

home = os.path.expanduser('~')

即使未定义HOME,这也会有用,并且可以概括为查找其他用户的主目录(os.path.expanduser('~someotheruser'))。

在Python 3.5+中,您还可以use pathlib.Path.home() to get a Path object representing the home directory

另外,在切向上,如果您需要通常使用一堆环境变量替换来扩展字符串,您可能需要查看os.path.expandvars,它将环境查找和字符串格式化作为单个操作。< / p>