簡體   English   中英

python subprocess在正在運行的子進程內插入命令

[英]python subprocess insert commands inside of a running subprocess

我有一個運行的子進程:

cmd="bin/candc --models models"
subprocess.check_output('{} | tee /dev/stderr'.format( cmd ), shell=True,cwd=os.path.abspath('candc'))

我希望能夠插入更多只能由當前運行的子進程識別的命令。
請注意,必須有一個cwd=os.path.abspath('candc')參數,以便從二進制文件夾外部調用子cwd=os.path.abspath('candc') ,否則它將不會運行。
C&C是一個NLP庫,它實際要做的是解析一個給定的句子。 我希望能夠將句子傳遞給子進程。 我怎樣才能做到這一點 ?

我想你要問的是如何將命令傳遞給candc的標准輸入,就像你在命令行上運行命令並在其界面上鍵入命令一樣。


如果您可以將所有命令一次作為一個大字符串傳遞(可能由換行符連接),則可以使用input參數執行此操作,如check_output文檔中的示例所示:

cmd="bin/candc --models models"
commands="""first candc command
second candc command
third candc command
"""
subprocess.check_output('{} | tee /dev/stderr'.format(cmd), shell=True,
                        cwd=os.path.abspath('candc'),
                        input=commands)

如果這是Python 3.x,您還必須使用編碼字節作為commands ,或添加universal_newlines=True以使check_output為您執行此操作。 如果您的命令是純ASCII,前者更容易; 只需將該行更改為commands = b"""…

如果這是一個足夠老的版本(我認為這意味着2.6 / 3.2,但我不確定 - 檢查上面鏈接的文檔), input參數尚不存在。 在這種情況下,您有三種選擇:

  • 安裝subprocess32關閉的PyPI,其反向移植庫的較新版本舊版本的Python。
  • 看看當前源如何處理input參數並自己完成同樣的事情。
  • check_output之前, Popen.communicate接受了一個input參數,因此,你可以手動創建一個Popen並在其上調用communicate

最后一個基本上只是第二個的簡單版本...但它更簡單。 事實上,如果你不需要處理超時和使用輸出做一些事情等所有額外的復雜性,它只是一個雙線程:

p = subprocess.Popen('{} | tee /dev/stderr'.format(cmd), shell=True,
                     cwd=os.path.abspath('candc'), stdin=PIPE)
p.communicate(commands)

如果您需要以交互方式發送命令(在發送下一個之前等待一個響應),則check_output不能這樣做。 它只是Popen對象周圍的便利包裝器。 實際上,您將要創建一個Popen明確的目標,然后做p.stdin.writep.stdout.read與之通信。

例如,快速和臟的版本可能是:

p = subprocess.Popen('{} | tee /dev/stderr'.format(cmd), shell=True,
                     cwd=os.path.abspath('candc'), 
                     stdin=PIPE, stdout=PIPE)
for command in commands.splitlines():
    p.stdout.readline() # read and ignore a prompt
    p.stdin.write(command + '\n')
rc = p.wait()
if rc: raise SomeException() # this is the check in check_output

但是,如果提示超過一行,或者不能保證適合一個緩沖區,或者......

一般來說,這可能很難做到。 (在3.2或3.3之前,Python本身並沒有在communicate功能中做到正確...)特別是如果你不理解文檔與阻塞輸出管道有什么關系。 因此,如果這真的是您所需要的,您可能需要考慮使用第三方庫來驅動交互式命令行程序,例如pexpect ,而不是自己動手。

暫無
暫無

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

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