如果输出较短,Pexpect不会处理python脚本的输出,但适用于较长的输出

问题描述 投票:0回答:1

因此,我正在尝试使用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.terminatedFalse变为Trueread()readline()在第一种情况下也不返回任何输出,但在第二种情况下可以正常工作。

这是在OSX上,python 3.7。

python pexpect
1个回答
0
投票

事实证明,这是pexpect的已知问题。解决方案似乎是用外壳将命令包装起来,例如

s = pexpect.spawn('bash -c spawn_test.py')

不理想,但是确实解决了上述情况。

感觉这背后有一个不同的实际问题,但是这种解决方法就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.