4

我可能根本没有正确理解这一点,但我试图让 Python 程序与运行命令的子进程交互,就像在 Linux shell 上一样。

例如,我希望能够在程序中运行“cd /”然后“pwd”并获取“/”。

我目前正在尝试使用 subprocess.Popen 和communicate() 方法来发送和接收数据。与 Popen 构造函数一起发送的第一个命令运行良好并给出了正确的输出。但我无法通过通信(输入 =“pwd”)发送另一个命令。

到目前为止我的代码:

from subprocess i
term=Popen("pwd", stdout=PIPE, stdin=PIPE)
print(flush(term.communicate()))
term.communicate(input="cd /")
print(flush(term.communicate(input="pwd")))

有一个更好的方法吗?谢谢。

另外,我正在运行 Python 3。

4

1 回答 1

0

首先,您需要了解运行 shell 命令和运行程序不是一回事。

让我给你举个例子:

>>> import subprocess
>>> subprocess.call(['/bin/echo', '$HOME'])
$HOME
0
>>> subprocess.call(['/bin/echo $HOME'], shell=True)
/home/kkinder
0

请注意,如果没有 shell=True 参数,$HOME则不会扩展 的文本。那是因为/bin/echo程序不解析$HOME,Bash 可以。第二次通话中真正发生的事情与此类似:

>>> subprocess.call(['/bin/bash', '-c', '/bin/echo $HOME'])
/home/kkinder
0

使用shell=True参数基本上是对子进程模块说,使用 shell 解释此文本

因此,您可以添加shell=True,但问题是一旦命令完成,它的状态就会丢失。堆栈中的每个应用程序都有自己的工作目录。所以目录是这样的:

  • 重击 - /foo/bar
    • 蟒蛇 - /foo
      • 通过子进程 bash - /

命令执行后,python 进程的路径保持不变,一旦 shell 完成命令,子进程的路径将被丢弃。

基本上,你所要求的并不实用。你需要做的是,打开一个通往 Bash 的管道,交互式地输入你的用户类型的命令,然后以非阻塞方式读取输出。这将涉及复杂的管道、螺纹等。你确定没有更好的方法吗?

于 2013-01-03T21:59:41.667 回答