我有一個python腳本,需要將一些值輸出到stdin並將另一個字符串複製到剪貼板。我使用的模塊subprocess
通過Popen
這樣的事情來執行xclip
實用程序:使用子進程和xclip的Python腳本在bash中進行管道連接時掛起
# clip.py
import subprocess
from subprocess import Popen
print('PRINT_ME')
p1 = Popen(['xclip', '-selection', 'clipboard'], stdin=subprocess.PIPE)
p1.communicate(input=('PASTE_ME'.encode()))
該腳本按預期工作:PRINT_ME
迴盪在bash和PASTE_ME
可用粘貼,和imediatly返回。
將腳本輸出傳送到另一個命令時出現問題。假設一個人想重定向到文件和標準輸入使用tee
:
$ python clip.py|tee file.txt
該項目工程的設想,但沒有回報,即外殼不給控制了。
這怎麼能解決?
一些重要信息:在xclip
實用叉本身(應付執行X上的剪貼板)保持串avaliable複製,在殼使用時,它會立即返回(它叉背景)。看起來,shell將clip.py
和xclip
stdin/stdout連接到tee
。
如果使用ps u
找到xclip -selection clipboard
並殺死命令返回。
我正在使用Python 3.4。
感謝
感謝您的回答,兩種方式都很好!我測試了各種修改,發現有趣的是執行'p1.communicate'之後的任何代碼(在原始缺陷代碼中),程序將暫停退出。從提出的兩個更「pythonic」和副作用的解決方案是免費的嗎? – mglart
你是對的,我已經表達得很糟糕 - Popen爲xclip的STDOUT打開了一個FH(並且將它綁定到當前的STDOUT),並且由於'xclip'永遠不會關閉最後等待的流,所以它可以乾淨地退出子。至於_Pythonic_ - 這是一個虛幻的術語,對不同的人意味着不同的事物,但大多數人傾向於同意KISS方法是_Pythonic_的縮影 - 因此,除非您需要對STDIN/STDOUT進行一些操作,只需使用' POPEN。溝通()',並且在xclip已經允許你將它設置爲可以很好地與Python一起使用時節省一些麻煩。 – zwer