我有一個Python腳本,需要通過命令行與用戶交互,同時記錄任何輸出。Python腳本和linux shell之間的交互
我目前有這樣的:
# lots of code
popen = subprocess.Popen(
args,
shell=True,
stdin=sys.stdin,
stdout=sys.stdout,
stderr=sys.stdout,
executable='/bin/bash')
popen.communicate()
# more code
此執行外殼命令(例如adduser的newuser02)只是因爲它會鍵入它時到終端,包括交互行爲。這很好。
現在,我想從Python腳本內記錄出現在屏幕上的所有內容。但我似乎無法讓這部分工作。
我已經嘗試過使用subprocess.PIPE的各種方式,但這通常會使交互性變得模糊,就像不輸出提示字符串一樣。
我也嘗試過各種方法直接改變sys.stdout的行爲,但作爲子進程直接寫入sys.stdout.fileno(),這一切都無濟於事。
作爲一個側面說明,有沒有使用了'殼= TRUE'理由嗎?特別是當你啓動的東西本身是'/ bin/bash'?你基本上是告訴Python開始一個'bash'的副本,告訴它開始另一個'bash'的副本(大概是因爲你沒有顯示整個代碼)告訴它開始一個'adduser'副本。你可能不需要涉及一個shell,但我無法想象爲什麼你需要兩個shell。 – abarnert
@abarnert:'executable'不會啓動一個新的'bash'過程:如果'shell = True',它告訴'subprocess'模塊使用它的值而不是'/ bin/sh'。 'args'大概是一些帶有bash-isms的shell命令,比如''use_tty&>/dev/null''。據我所知,意圖是:'script -c'/ bin/bash -c「$ args」'log'。雖然[我的答案顯示](http://stackoverflow.com/a/22265426/4279),你不一定需要一個額外的bash過程來在這裏運行一個命令。 – jfs