Python中的持久终端会话
我可能根本没有正确理解这一点,但我正试图允许Python程序与在Linux shell上运行命令的子进程进行接口 例如,我希望能够在程序中运行“cd/”和“pwd”,然后运行“get/” 我目前正在尝试使用subprocess.Popen和communicate()方法发送和接收数据。第一个命令(与Popen构造函数一起发送)运行良好,并提供正确的输出。但我无法通过communicate(input=“pwd”)发送另一个命令 到目前为止,我的代码是:Python中的持久终端会话,python,linux,Python,Linux,我可能根本没有正确理解这一点,但我正试图允许Python程序与在Linux shell上运行命令的子进程进行接口 例如,我希望能够在程序中运行“cd/”和“pwd”,然后运行“get/” 我目前正在尝试使用subprocess.Popen和communicate()方法发送和接收数据。第一个命令(与Popen构造函数一起发送)运行良好,并提供正确的输出。但我无法通过communicate(input=“pwd”)发送另一个命令 到目前为止,我的代码是: from subprocess i ter
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。首先,您需要了解运行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
,但问题是,一旦命令完成,其状态将丢失。堆栈中的每个应用程序都有自己的工作目录。因此,目录是这样的:
- bash-/foo/bar
- python-/foo
- 通过子流程bash-/
- python-/foo
基本上,你所要求的是不实用的。你需要做的是,打开一个管道到Bash,以交互方式输入你的用户类型的命令,然后以非阻塞方式读取输出。这将涉及一个复杂的管道、线程等。你确定没有更好的方法吗?使用
os.chdir
方法。我也是这样做的我必须为每个命令创建一个新的Popen对象吗?不太可能。但在本例中,pwd
只打印其输出并立即退出。没有运行的进程可与之通信。您确实需要为每个命令使用fork/exec,除非正在构建管道,否则这是正常的shell行为。在这种情况下,eve确实需要一个Popen我命令你。