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

标签 python linux python-2.7 shell subprocess

<分区>

我在这里绞尽脑汁试图在不使用 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

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

最佳答案

让我们从答案开始

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

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

关于Python 子进程帮助 - 不能使用 shell=true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40136017/

相关文章:

python - 如何创建自定义 keras 层 "min pooling"但忽略零?

python - tf.py_func() 使用 lambda 函数在循环中意外输出

Python通过json返回一个字符串

python - UnboundLocalError : local variable 'sum' referenced before assignment

python - 将 SQL 查询转换为 mongo 查询

linux - 将密码应用于脚本

linux - Shell 将最大尺寸的文件复制到另一个文件夹

linux - AWK重命名多行

python - 所有 '1'组成的最长子数组的长度

python - 如何在python中计算百分比