【发布时间】:2017-03-01 08:48:15
【问题描述】:
我在这里绞尽脑汁,试图在不使用 shell=true 的情况下用 python 做一个简单的函数,但没有得到我需要的结果。我在 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)
找到一些说使用 os... 的文档也失败了,在发现 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
有人可以指出我正确的方向吗?我花了一整天的时间摆弄这个,我需要帮助。预先感谢您提供的任何帮助。
【问题讨论】:
-
在
var1 = s.Popen(['echo', '$HOME'], stdout=s.PIPE)中,只有第一个数组元素被视为脚本。后续数组元素是该脚本的参数。 -
...顺便说一句,你真正的用例是什么?一般来说,使用
shell=True是错误的;如果没有足够(大量!)谨慎使用,它会引入安全错误,并且不会通过让 Python 更冗长来做任何你不能做的事情。
标签: python linux python-2.7 shell subprocess