代碼
在 b.py 中
# b.py
import subprocess
from sys import stdout
cmd = ['python2.7','a.py']
try:
subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
except subprocess.CalledProcessError as e:
print 'cmd:', e.cmd, 'end'
print 'output:', e.output,'end'
print 'returncode:', e.returncode, 'end'
print 'ok'
在一個.py
# a.py
import sys
print 'a.py'
sys.stderr.write('stderr\n')
sys.stdout.write('stdout\n')
exit(-1)
我所做的
在我打電話后python2.7 b.py
,它停止了,好像在等待輸入。
在我輸入之后ctrl-c
,回溯是:
/home/liweiming/app/test〉python2.7 b.py 06/07/2022 11:25:07 AM
^CTraceback (most recent call last):
File "b.py", line 10, in <module>
subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
File "/usr/lib/python2.7/subprocess.py", line 217, in check_output
output, unused_err = process.communicate()
File "/usr/lib/python2.7/subprocess.py", line 475, in communicate
stdout = _eintr_retry_call(self.stdout.read)
File "/usr/lib/python2.7/subprocess.py", line 125, in _eintr_retry_call
return func(*args)
KeyboardInterrupt
但如果我使用subprocess.check_output(shell=False)
,該程式很好。
uj5u.com熱心網友回復:
隨著shell=True
命令變成['sh', '-c', 'python2.7', 'a.py']
——這a.py
作為一個引數傳遞給sh
(它被粗略地忽略——它$0
在互動式腳本中設定但沒關系,因為那個腳本只是python2.7
)——然后運行python2.7
由于該命令仍連接到終端,它將等待輸入(就像互動式解釋器所做的那樣)——例如嘗試輸入1 1<enter><^D>
,您將得到輸出(來自互動式python2.7
本身)
絕對是一種奇怪的行為,我寧愿希望命令是 list shell=True 會引發 TypeError (要求命令是字串) - 但唉
shell=True
這是將位置引數傳遞給 shell 字串的行為示例:
>>> subprocess.check_output(['echo $0 $1', 'hello', 'world'], shell=True)
b'hello world\n'
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487283.html
標籤:Python python-2.7 子进程
上一篇:WindowsHello識別配置的登錄型別(HelloFace/Hello指紋)-UWP
下一篇:洗掉串列中所有出現的術語