我想装饰python.exe
。例如,当我们在交互模式下从Input:\n
前缀读取时,当我们写入stdin
和Output:\n
时,它可能只是stdout
:
原始python.exe
:
$ python
Python 3.6.1 |Anaconda custom (64-bit)| (default, Mar 22 2017, 20:11:04) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print(2)
2
>>> 2 + 2
4
>>>
例外装饰python.exe
:
$ decorated_python
Output:
Python 3.6.1 |Anaconda custom (64-bit)| (default, Mar 22 2017, 20:11:04) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
Input:
print(2)
Output:
2
>>>
Input:
2 + 2
Output:
4
>>>
我认为它应该是这样的:
import subprocess
pid = subprocess.Popen("python".split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
pid.stdin.write(input('Input:\n').encode())
print('Output:\n' + pid.stdout.readlines())
但pid.stdout.readlines()
从未完成。
我也尝试使用communicate
方法,但它只是第一次使用:
import subprocess
pid = subprocess.Popen("python".split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
print('Output:\n', pid.communicate(input('Input:\n').encode()))
测试:
Input:
print(1)
Output:
(b'1\r\n', b'')
Input:
pritn(1)
Traceback (most recent call last):
File "C:/Users/adr-0/OneDrive/Projects/Python/AdrianD/temp/tmp.py", line 6, in <module>
print('Output:\n', pid.communicate(input('Input:\n').encode()))
File "C:\Users\adr-0\Anaconda3.6\lib\subprocess.py", line 811, in communicate
raise ValueError("Cannot send input after starting communication")
ValueError: Cannot send input after starting communication
也许我只是错过了一些东西,因为如果我只在2
放python
,我会得到2
。但我无法使用2
方法获取此communicate
:
Pure python:
>>> 2
2
使用communicate
方法修饰:
Input:
2
Output:
(b'', b'')
答案 0 :(得分:1)
如果你看一下python文档,你可以发现当使用stdin / stdout = PIPE时,几乎不建议不对这些流使用读/写操作,因为它会导致死锁 - 你在执行readlines时实际遇到过: https://docs.python.org/2/library/subprocess.html#popen-objects
下一个问题是到期
&#34; Popen.communicate()是一种辅助方法,它将数据一次性写入stdin并创建线程以从stdout和stderr中提取数据。当它完成写入数据并读取stdout和stderr直到那些管道关闭时它关闭stdin。您无法进行第二次沟通,因为孩子在返回时已经退出。&#34; @tdelaney
更多信息: Multiple inputs and outputs in python subprocess communicate
一般来说,交互式子进程很难,您可以尝试使用 https://pexpect.readthedocs.io/en/stable/