keywords: python 命令列程式 自動化 互動
以這個python程式為例:
# coding:utf8
# python3
import random
first_num = str(random.randint(0, 10))
second_num = str(random.randint(0, 10))
first_input = input('input {}: '.format(first_num))
second_input = input('input {}: '.format(second_num))
if first_num==first_input and second_num==second_input:
print('right!')
else:
print('wrong!')
用指令碼呼叫這個程式,並自動輸出 'rignt!',使用 subprocess 實現:
# coding:utf-8
# python3
import sys
import re
import subprocess
from threading import thread
class processinteraction:
process = none
def __init__(self, command):
self.process = subprocess.popen(
command, stdin=subprocess.pipe, stdout=subprocess.pipe)
def __del__(self):
self.process.stdin.close()
self.process.stdout.close()
def recvline(self):
return self.process.stdout.readline().decode('utf8')
def recv_n(self, n):
return self.process.stdout.read(n).decode('utf8')
def recvuntil(self, want_end_str):
current_str = ''
while true:
current_str += self.recv_n(1)
if current_str.endswith(want_end_str):
return current_str
def recvuntil_re(self, want_re_str):
current_str = ''
while true:
current_str += self.recv_n(1)
s = re.search(want_re_str, current_str)
if s:
return [current_str, s]
def send(self, send_str):
final_bytes = send_str.encode('utf8')
self.process.stdin.write(final_bytes)
self.process.stdin.flush()
def sendline(self, send_str):
self.send(send_str+'\n')
def interact(self):
def recv_loop():
while true:
c = self.recv_n(1)
# print 寫到控制台會有延時,直接用系統io寫
sys.stdout.write(c)
sys.stdout.flush()
def send_loop():
while true:
send_str = input()
self.sendline(send_str)
recv_thread = thread(target=recv_loop)
send_thread = thread(target=send_loop)
recv_thread.start()
send_thread.start()
recv_thread.join()
send_thread.join()
command = ['py', '-3', 'want_right.py']
pi = processinteraction(command)
for i in range(2):
content = pi.recvuntil_re(r'input (\d+): ')
print(content[0])
num = content[1].group(1)
print(repr(num))
pi.sendline(num)
content = pi.recvline()
print(content)
注意:如果在 linux 下執行,command 需要修改為['python3', 'want_right.py']
輸出:
input 5:
'5'input 0:
'0'right!
感謝 zl python 命令列程式的自動化互動
keywords python 命令列程式 自動化 互動 以這個python程式為例 coding utf8 python3 import random first num str random.randint 0,10 second num str random.randint 0,10 firs...
Python編寫帶選項的命令列程式
執行python程式時,有時需要在命令列傳入一些引數。常見的方式是在執行時,在指令碼名後直接追加空格分隔的引數列表 例如 python test.py arg0 arg1 arg2 然後在指令碼中就可以通過sys.argv獲取所有的命令列引數。這種方式的優點是傳參方便,引數獲取簡單 缺點是執行指令碼...
C 呼叫命令列程式
using system using system.collections.generic using system.linq using system.text using system.diagnostics 執行cmd命令 會顯示命令視窗 指定應用程式的完整路徑 執行命令列引數 static ...