[英]Pass variable to bash command with Python
我有下一個代碼:
from subprocess import Popen, PIPE
p = Popen("C:/cygwin64/bin/bash.exe", stdin=PIPE, stdout=PIPE)
path = "C:/Users/Link/Desktop/folder/"
p.stdin.write(b"cd " + str.encode(path)))
p.stdin.close()
out = p.stdout.read()
print(out)
output
是b''
有什么辦法可以將變量傳遞給bash命令p.stdin.write(b"cd " + path)
我問,因為上面的寫法行不通。 輸出為空,就像Cygwin啟動一樣,什么也沒有。
編輯
只要我看到的問題不是很清楚,我就添加這種情況:
我在Windows上,並且正在使用Python 3.6。 我有一個bash cmd,要求執行Cygwin。 此cmd的字符串中可能有一個變量,該變量將在每次執行后更改。 想象一個執行命令的for
循環。
例如(一個ImageMagick命令):
convert image.jpg -resize 1024x768 output_file.jpg
如何使用output_file.jpg
作為變量從Python執行此cmd?
Bash默認情況下不會以交互方式運行,除非它檢測到標准輸入和輸出已連接到終端。 您將它們插入PIPE
,因此它們肯定沒有連接到終端。
Bash在非交互模式下不顯示任何提示,因此您什么也看不到。 您可以強制它與-i
開關交互。
但是,即使那樣,它也不會寫到stdout
而是寫到stderr
。 您可以嘗試將stderr管道連接到stdout
from subprocess import Popen, PIPE, STDOUT
p = Popen(["C:/cygwin64/bin/bash.exe", "-i"], stdin=PIPE, stdout=PIPE, stderr=STDOUT)
您將捕獲提示等。
或將原始方法與產生輸出的命令一起使用-在這里pwd
打印當前工作目錄:
p.stdin.write(b"cd " + path.encode() + b"\n")
p.stdin.write(b"pwd")
但是,與這樣的交互過程進行交談是棘手的-讀得太少=>死鎖。 寫太多=>死鎖。 這就是Popen
具有.communicate
方法的原因,該方法可一次提供所有輸入,然后再獲取stdout
和stderr
。
看來您正在使用Cygwin python,而不是應該使用正確的Posix路徑而不是Windows路徑
代替
p = Popen("C:/cygwin64/bin/bash.exe", stdin=PIPE, stdout=PIPE)
采用
p = Popen("/bin/bash.exe", stdin=PIPE, stdout=PIPE)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.