在python中执行相关的os命令

时间:2016-09-30 19:03:46

标签: python linux shell command subprocess

我正在尝试在python中创建一个简单的脚本,它本质上是一个shell终端。它将反复询问输入命令并尝试执行给定的os命令。我无法弄清楚的是,如何让Python“记住”执行的命令。

我的意思是:

  1. 用户输入ls
  2. Python打印当前目录的内容
  3. 下一位用户输入cd exampledir
  4. Python执行命令
  5. 用户输入ls
  6. Python打印exampledir
  7. 的内容

    由于命令序列是ls> cd exampledir> ls我希望程序返回exampledir的内容,而是两个ls命令的输出相同。

    有没有办法让Python以某种方式'记住'执行的命令并根据以前的命令执行下一个命令?

    我知道你可以使用cd exampledir && ls之类的东西,但这不是我想要的。这些命令必须像shell终端一样单独执行。

    到目前为止

    代码:

    import subprocess
    
    while True:
        cmd = input("Command to Execute: ")
        p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        out = p.communicate()[0]
        print(out)
    

2 个答案:

答案 0 :(得分:1)

你不能cd使用subprocess模块,该函数将运行但路径不会因正在运行的python脚本而改变,
你可以做的是:

import os
if # condition where cd command used:
  os.chdir("path/to/new/dir")

这将改变您正在运行的python脚本的路径,然后您可以ls获得不同的输出。

答案 1 :(得分:0)

你必须要理解的是:你想写一个shell命令的完整解释器。这意味着:任何改变 shell 状态的命令都需要改变一些内部状态。

含义:你的python"翻译"在某个目录中启动。因此,当您告诉解释程序更改目录时,它不能将该请求发送到某个稍后会消失的shell。

换句话说:你不能双管齐下。您可以将所有命令传递到子流程中;导致构成问题的问题。或者你的翻译" "所有的工作"本身。

只是为了记录:正如你可能已经猜到的那样 - 写一个" shell"是一项复杂的任务。是什么让你认为你应该重新发明那个轮子?