使用python子进程运行shell命令[重复]
Posted
技术标签:
【中文标题】使用python子进程运行shell命令[重复]【英文标题】:running shell command using python subprocess [duplicate] 【发布时间】:2018-08-13 01:14:18 【问题描述】:为什么 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
【问题讨论】:
【参考方案1】:当你传入一个列表时,只有第一项被视为一个命令。其余部分被视为用于运行命令的 shell 的参数。来自Python docs:
在 shell=True 的 POSIX 上,shell 默认为 /bin/sh。如果 args 是 string,字符串指定要通过shell执行的命令。 这意味着字符串必须完全按照它的格式进行格式化 在 shell 提示符下键入时。这包括,例如,引用或 反斜杠转义带有空格的文件名。如果 args 是 序列,第一项指定命令字符串,任何 附加项将被视为 shell 的附加参数 本身。也就是说,Popen 相当于:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
【讨论】:
以上是关于使用python子进程运行shell命令[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Python 子进程 - 通过 SSH 运行多个 shell 命令
使用子进程从 Python 运行 PDAL bash 命令的问题 [重复]
如何终止使用 shell=True 启动的 python 子进程