Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的持久终端会话_Python_Linux - Fatal编程技术网

Python中的持久终端会话

Python中的持久终端会话,python,linux,Python,Linux,我可能根本没有正确理解这一点,但我正试图允许Python程序与在Linux shell上运行命令的子进程进行接口 例如,我希望能够在程序中运行“cd/”和“pwd”,然后运行“get/” 我目前正在尝试使用subprocess.Popen和communicate()方法发送和接收数据。第一个命令(与Popen构造函数一起发送)运行良好,并提供正确的输出。但我无法通过communicate(input=“pwd”)发送另一个命令 到目前为止,我的代码是: from subprocess i ter

我可能根本没有正确理解这一点,但我正试图允许Python程序与在Linux shell上运行命令的子进程进行接口

例如,我希望能够在程序中运行“cd/”和“pwd”,然后运行“get/”

我目前正在尝试使用subprocess.Popen和communicate()方法发送和接收数据。第一个命令(与Popen构造函数一起发送)运行良好,并提供正确的输出。但我无法通过communicate(input=“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。

首先,您需要了解运行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进程的路径保持不变,并且一旦shell完成命令,子进程的路径将被丢弃


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

使用
os.chdir
方法。我也是这样做的我必须为每个命令创建一个新的Popen对象吗?不太可能。但在本例中,
pwd
只打印其输出并立即退出。没有运行的进程可与之通信。您确实需要为每个命令使用fork/exec,除非正在构建管道,否则这是正常的shell行为。在这种情况下,eve确实需要一个Popen我命令你。