我在这里试图用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
有人可以指出我正确的方向吗?我花了整整一天摆弄这个,我需要帮助。提前感谢您提供任何帮助。
答案 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>