使用python子进程运行shell命令[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python子进程运行shell命令[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

为什么python的subprocess.Popen()行为在运行shell命令作为字符串和列表时是奇怪的?什么时候我们应该将shell命令作为字符串和列表传递?

>>> import subprocess
>>> p = subprocess.Popen('du -sh *', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
>>> stdout, _ = p.communicate()
>>> print stdout[:1000]
244M    bin
3.1M    bmps
14M     buildweb
10M     contrib
4.0M    gobuild
168K    gobuild-starter-kit
468K    gobuild-test
3.6M    lib
46M     machines
1.4M    machineweb
75M     microservices
1.4M    monthly_maintenance
20K     perforce
9.1M    scheduler
196K    service
2.5M    statusweb
516K    storage
228K    symindex
7.2M    webapps

>>> p = subprocess.Popen('du -sh *'.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
>>> stdout, _ = p.communicate()
>>> print stdout[:1000]
8       ./statusweb/infrastructure/management/commands
12      ./statusweb/infrastructure/management
16      ./statusweb/infrastructure
48      ./statusweb/statusweb/settings
56      ./statusweb/statusweb
164     ./statusweb/dashboard/migrations
8       ./statusweb/dashboard/tests/fixtures
64      ./statusweb/dashboard/tests
12      ./statusweb/dashboard/static/dashboard/img
12      ./statusweb/dashboard/static/dashboard/css
48      ./statusweb/dashboard/static/dashboard/js/status
12      ./statusweb/dashboard/static/dashboard/js/spec
72      ./statusweb/dashboard/static/dashboard/js
100     ./statusweb/dashboard/static/dashboard
104     ./statusweb/dashboard/static
36      ./statusweb/dashboard/templates/dashboard/dust
32      ./statusweb/dashboard/templates/dashboard/emails
88      ./statusweb/dashboard/templates/dashboard
8       ./statusweb/dashboard/templates/admin/dashboard/issue
8       ./statusweb/dashboard/templates/admin/dashboard/maintenance
20      ./statusweb/dashboard/templates/admin/dashboard
28      ./statusweb/dashboard/templates/admin
8       ./statusweb/dashboard/templates/registra
答案

传入列表时,只将第一个项目视为命令。其余部分被视为用于运行命令的shell的参数。来自Python docs

在POSIX上,shell = True,shell默认为/ bin / sh。如果args是一个字符串,则该字符串指定要通过shell执行的命令。这意味着字符串的格式必须与在shell提示符下键入时完全相同。这包括,例如,引用或反斜杠转义带有空格的文件名。如果args是一个序列,则第一个项指定命令字符串,并且任何其他项将被视为shell本身的附加参数。也就是说,Popen相当于:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

以上是关于使用python子进程运行shell命令[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python 子进程 - 通过 SSH 运行多个 shell 命令

子进程命令Python的实时输出状态[重复]

使用子进程从 Python 运行 PDAL bash 命令的问题 [重复]

如何终止使用 shell=True 启动的 python 子进程

何时对 Python 子进程模块使用 Shell=True [重复]

python子进程中shell = True或False之间的区别[重复]