因此,我正在尝试使用pexpect驱动某些输出,并产生一些奇怪的结果。
为了进行测试,我有这个脚本,它只打印一些内容供我期望:
#!/usr/bin/env python3
for _ in range(4):
print('test')
print('<<<canary>>>')
for _ in range(4):
print('other stuff')
print('<<<end>>>')
然后,我希望在ipython会话中对此有所期待。但是,似乎根本看不到它:
In [1]: import pexpect
In [2]: s = pexpect.spawn('./spawn_test.py', logfile=open('outfile.log', 'wb'))
In [3]: s.expect('<<<canary>>>')
---------------------------------------------------------------------------
EOF Traceback (most recent call last)
EOF: End Of File (EOF). Empty string style platform.
In [4]: s.before
Out[4]: b''
In [5]: s.buffer
Out[5]: b''
完全没有输出。但是,如果我只是将原始脚本中的范围增大(例如,从40000改为40000),那么它将正常工作:
#!/usr/bin/env python3
for _ in range(40000):
print('test')
print('<<<canary>>>')
for _ in range(40000):
print('other stuff')
print('<<<end>>>')
然后
In [1]: import pexpect
In [2]: s = pexpect.spawn('./spawn_test.py', logfile=open('outfile.log', 'wb'))
In [3]: s.expect('<<<canary>>>')
Out[3]: 0 (0x0)
In [4]: s.expect('<<<end>>>')
Out[4]: 0 (0x0)
奇怪的是,即使它在第二种情况下都可以工作(这证明该方法总的来说是可行的),但在第一种情况下,脚本根本没有输出-我一直逐步进入该函数到os.read(self.fileno),它什么也没返回。这没有任何意义,所以我觉得我缺少一些东西。同样,在抛出EOF的期望值之后,s.terminated
从False
变为True
; read()
和readline()
在第一种情况下也不返回任何输出,但在第二种情况下可以正常工作。
这是在OSX上,python 3.7。
事实证明,这是pexpect的已知问题。解决方案似乎是用外壳将命令包装起来,例如
s = pexpect.spawn('bash -c spawn_test.py')
不理想,但是确实解决了上述情况。
感觉这背后有一个不同的实际问题,但是这种解决方法就足够了。