簡體   English   中英

使用Python將變量傳遞給bash命令

[英]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)

outputb''

有什么辦法可以將變量傳遞給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方法的原因,該方法可一次提供所有輸入,然后再獲取stdoutstderr

看來您正在使用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.

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