子进程python没有关闭cmd

时间:2016-11-16 20:49:31

标签: python subprocess

我想创建一个可以完全访问我的windows pc的cmd的函数。所以例如在Windows中我可以 cd C:\ Users \ Rony \ Documents \ Hello 然后运行 dir 以查看当前文件夹中的文件直到我运行命令退出,cmd不会退出。我希望能够在python中做同样的事情,我看到我必须使用子进程的函数popen。但我不明白如何在python的文档中这样做。我尝试做一些事情,但我没有成功做到这一点。

def run_cmd():
subprocess.Popen("cd C:\Users\Rony\Documents\Apple", shell=True)
subprocess.Popen("dir\n")

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我担心你必须做得更好。

每个subprocess.Popen命令都在一个单独的进程中执行,因此您在第一次调用中发出的更改目录命令只具有局部效果,对其他命令没有影响。

对于其他命令,它会起作用。你只需要“单独”处理内置命令。

我写了一个简单的循环来帮助你入门。为了正确引用解析,我使用了方便的shlex module

import subprocess,os,shlex

while True:
    command = input("> ").strip()
    if command:
        # tokenize the command, double quotes taken into account
        toks = shlex.split(command)
        if toks[0] == "cd" and len(toks)==2:
            newdir = toks[1]
            try:
                os.chdir(newdir)
            except Exception as e:
                print("Failed {}".format(str(e)))
            else:
                print("changed directory to '{}'".format(newdir))
        else:
            p = subprocess.Popen(command,shell=True)
            rc=p.wait()
            if rc:
                print("Command failed returncode {}".format(rc))

特点: - cd命令以特殊方式处理。执行os.chdir,以便您可以使用相对路径。如果需要,您还可以检查路径并禁止某些目录中的cd'ing。 - 自os.chdir执行以来,对subprocess.Popen的下一次调用在更改的目录中完成,保留先前的cd命令,而不是您的尝试。 - 处理引号(使用shlex模块,可能与windows cmd有区别!) - 失败的命令打印返回代码 - 如果目录不存在,则输出错误而不是崩溃:)

当然它非常有限,没有环境。变量集,没有cmd仿真,这不是重点。

小测试:

> cd ..
changing directory to ..
> cd skdsj
changing directory to skdsj
Failed [WinError 2] Le fichier spécifié est introuvable: 'skdsj'
> dir
 Le volume dans le lecteur C s’appelle Windows
 Le numéro de série du volume est F08E-C20D

 Répertoire de C:\DATA\jff\data\python\stackoverflow

12/10/2016  21:28    <DIR>          .
12/10/2016  21:28    <DIR>          ..
12/10/2016  21:28    <DIR>          ada
08/10/2016  11:11               902 getopt.sh
09/10/2016  20:14               493 iarray.sh
19/08/2016  12:28    <DIR>          java
16/11/2016  21:57    <DIR>          python
08/10/2016  22:24                51 toto.txt
              10 fichier(s)            2,268 octets
              10 Rép(s)  380,134,719,488 octets libres
>