簡體   English   中英

Python-將控制台命令傳遞給第三方控制台應用程序

[英]Python - pass console command to 3rd party console application

我有一個問題,但很難為我解釋:

我有一個應用程序(叫它abc),它有自己的控制台-該soncole通過CMD像這樣運行: abc console console.xml abc console在同一窗口中啟動,但是C:\\> ,我只能得到> -休息就像CMD。

我知道我可以運行cmd命令,例如:

self.full_path = 'dir /b'
self.pipe = check_output(self.full_path, shell=True, universal_newlines=True).strip()

但是,當我嘗試這樣做時:

self.full_path = 'abc console console.xml'
self.pipe = check_output(self.full_path, shell=True, universal_newlines=True).strip()

沒有任何反應,控制台凍結。 我試圖添加更多命令,以檢查盡管“凍結”我是否可以做一些事情,例如導出一些xml,但是什么也沒發生。

有什么辦法可以將任何命令傳遞給abc?

如果您的應用程序足夠簡單,它將可能通過其標准輸入接受命令。 如果直接在外殼中運行它,則它將直接從您自己提供的輸入中獲取其標准輸入(除非您使用重定向)。

但是,如果您將其作為另一個Python程序的子進程運行,並且想要自動化其輸入,則必須告訴您的Python代碼將其輸入到應用程序的stdin通道中。

subprocess模塊有兩種方法可以做到這一點。 假設您只想向應用程序提供一次或一組命令,而無需對以后的輸出,定時敏感的動作或用戶交互做出反應,則確實可以使用check_output()

import subprocess

external_command = 'abc console console.xml'
pass_command = 'twiddle knob\n'

output = subprocess.check_output(external_command, shell=True,
                                 universal_newlines=True,
                                 input=pass_command)

請注意,您向input參數傳遞了一個字符串,該字符串包含您要一次性發送的所有命令,並用換行符分隔(因此\\n )。

如果需要,可以從命令列表構建該字符串: pass_command = '\\n'.join(command_list) + '\\n'

如果您需要一種更靈活的方式來將輸入提供給應用程序,則可以改用stdin=參數,並向其傳遞文件對象或文件描述符。 或更確切地說,使用Popen()獲得更靈活的界面。

還要注意, check_output()不會返回管道,而是包含所有輸出的字符串。 因此,您需要確保您的應用程序自行結束(或通過發送使其退出的命令),否則check_output()將永遠等待。 如果您不能或不想立即退出,則需要使用更靈活的Popen()接口並根據需要進行寫入/讀取。

感謝Blubberdiblub,我能夠做到這一點:

    print("\nStarting ABC console")
    self.pass_start = Popen(self.run_abc, shell=True, cwd=self.full_path, stdin=PIPE, universal_newlines=True)
    sleep(20) #becouse consol starts about 15 seconds

    print("\nExport application")
    self.pass_start.stdin.write(self.export_app)
    sleep(2)

    self.pass_start.kill()

也許它不是完美的,並且更高級的用戶可以做得更好,但是通過這種方式,我可以打開abc控制台,並向其中傳遞一些命令,而不是關閉此控制台。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM