1

我有一个从命令行运行的小 test.sh 脚本,./test.sh它会要求我输入我输入的 2 个问题,然后循环直到我ctrl-c退出。

我想编写一个可以运行我的 Python 小脚本test.sh,并从我在 Python 中设置的变量 var1 和 var2 输入脚本问题的输入。

我还想要另一个变量 var3,它循环 x 长并运行我的 test.sh,然后结束它,然后根据 var3 的值每 x 分钟重新启动一次

我写了这段代码,但它似乎没有test.sh在它启动后将命令传递给我:

import os
os.system('./test.sh arg1')
time.sleep(10)
sh('input answer 1')
time.sleep(5)
sh('input answer 2')

目前,我的代码已基于此线程进行了更新,如下所示:

#!/usr/bin/env python

import pexpect
import sys
import os
child = pexpect.spawn ('./test.sh -arg1')
child.expect ('some expected output from the .sh file')
child.expect ('more expected output from the .sh file')
child.expect ('(?i)Enter Username:')
child.sendline ('myusername')
child.expect ('(?i)Enter Password:')
child.sendline ('mypassword')
# sys.stdout.write (child.after)
# sys.stdout.flush()
time.sleep(30)
child.sendcontrol('c')
child.close()
print 'Goodbye'

--fixed-- 现在问题是我的超时或睡眠被打断了,可能是我的 .sh 脚本的输出。当我在未注释 timeout 或 time.sleep 的情况下运行此脚本时,它要么没有影响,要么直接进入我的 child.close() 并结束程序,要么挂断 child.sendline ('mypassword')出于某种原因,我卡在了 .sh 脚本的密码提示符中……也许它并没有真正卡在那里,因为我无法与之交互。 - 固定的 -

一旦我让脚本暂停 30 秒(或 x),那么我剩下要做的就是让整个事情循环 x 次。最后,我需要添加错误检查,因为 .SH 以不同的文本字符串响应,表明我需要立即再次运行脚本。

非常感谢大家的帮助!

4

2 回答 2

2

使用pexpect

import pexpect  # $ pip install pexpect

while var3:  # start ./test.sh again
    output = pexpect.run('./test.sh arg1', 
        timeout=x,  # terminate child process after x seconds
        events={r'(?i)question 1': var1,  # provide answers
                r'(?i)question 2': var2})  

注意:subprocess由于缓冲问题,基于 - 的解决方案可能更复杂,并且可能需要额外ptyselect模块、示例

于 2012-12-24T20:03:10.027 回答
1
import subprocess
p = subprocess.Popen('./test.sh arg1', stdin=subprocess.PIPE, stdout=subprocess.PIPE)

time.sleep(10)
p.stdin.write('input answer 1') #Probably adding \n is necessary
time.sleep(5)
p.stdin.write('input answer 2') #Probably adding \n is necessary

print p.stdout.readline() # To print one-line output of the shell script
于 2012-12-24T19:55:45.420 回答