python - 在 Python 中使用子进程复制 os.system 功能?

标签 python shell subprocess environment-variables os.system

在我的程序中,我想让用户运行 shell 命令或执行二进制文件。无论我读了多少关于subprocess.Popen的内容我想不出复制 os.system() 的方法功能。

我只是想echo $USER但似乎没有任何作用。

车削shell=True ..

>>> subprocess.Popen(['echo', '$USER'], shell=True,\
                     stdout=subprocess.PIPE,\
                     stderr=subprocess.PIPE).communicate()
>>> ('\n', '')

传递当前环境变量..

>>> subprocess.Popen(['echo', '$USER'], shell=True,\
                     env=os.environ\
                     stdout=subprocess.PIPE,\
                     stderr=subprocess.PIPE).communicate()
>>> ('\n', '')

那么运行 shell 命令的正确方法是什么?

--------编辑:要求---------

有些人发布了答案,但也许我应该更具体。我想将 stdoutstderr 和返回存储的值保留在某处。所有答案似乎都给出一个或另一个。

最佳答案

感谢 Massiou 的指导,我找到了答案。罪魁祸首是,当使用 shell=True 时,您应该将整个命令作为单个字符串传递!

>>> subprocess.Popen(['echo $USER'], shell=True, \
                     stdout=subprocess.PIPE,\
                     stderr=subprocess.PIPE).communicate()
>>> ('manos\n', '')

原因是列表中的第一个参数将作为 shell 脚本执行。其余参数用于 shell 程序本身。

关于python - 在 Python 中使用子进程复制 os.system 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35362925/

相关文章:

python - 前 N 个最相关列的平均值的 DataFrame

python - OpenCV 裁剪矩形

shell - 防止 TMUX 在 intellij 终端中启动

Python 子进程交互,为什么我的进程使用 Popen.communicate 而不是 Popen.stdout.read()?

javascript - 从 Pyramid View 的 subprocess.Popen 动态输出 stdout 到网页

python - 看似等效的列表初始化导致不同的行为

python - 如何使用 Python 3 的标准库测试非字符串序列

linux - 查找比特定列长/短的记录

ruby-on-rails - Rails 回形针处理器 : shell command failing

python - 在给定的 conda 环境中执行 python 脚本的最佳方式