gpt4 book ai didi

python - 使用 Python 将变量传递给 bash 命令

转载 作者:太空宇宙 更新时间:2023-11-03 21:39:47 25 4
gpt4 key购买 nike

我有下一个代码:

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)

输出b''

有没有办法将变量传递给bash命令p.stdin.write(b"cd "+ path)

我问是因为上面写的方式不起作用。输出为 null,就像 Cygwin 启动一样,没有其他内容。

编辑

只要我发现问题不太清楚,我就会添加这个场景:

我使用的是 Windows,并且使用的是 Python 3.6。我有一个 bash cmd,需要 Cygwin 才能执行。这个cmd的字符串中可能有一个变量,该变量在每次执行后都会改变。想象一个执行命令的 for 循环。

例如(ImageMagick 命令):

convert image.jpg -resize 1024x768 output_file.jpg

如何使用 output_file.jpg 作为变量从 Python 执行此命令?

最佳答案

默认情况下,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之后。

关于python - 使用 Python 将变量传递给 bash 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52956988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com