python3 linxu 运行shell命令 阻塞与非阻塞问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3 linxu 运行shell命令 阻塞与非阻塞问题相关的知识,希望对你有一定的参考价值。
参考技术A 这里用到subprocess内置库subprocess.check_output() 与 subprocess.Popen() 一个是阻塞另一个是非阻塞
主要讲 subprocess.Popen()
p = Popen(shell_str, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
如果不加shell=True,shell_str要写成list或者tuple类型
p.wait() 如果0是正常,1是有异常
p.stdin.read()
p.stdout.read()
p.stderr.read()
stdin , stdout, stderr 分别是标准输出, 正常输出, 错误输出
例子:
from subprocessimport *
p = Popen(shell_str.split(' '), stdin=PIPE, stdout=PIPE, stderr=PIPE)
p_statuscode = p.wait()
使用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], ...])
以上是关于python3 linxu 运行shell命令 阻塞与非阻塞问题的主要内容,如果未能解决你的问题,请参考以下文章