【问题标题】:Subprocess python without closing the cmd子进程python而不关闭cmd
【发布时间】:2017-03-31 05:40:07
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

  • 它与this one 非常相似。从那个答案开始,您应该使用该命令在 Windows 中打开“shell”而不是/usr/bin/cat。您应该使用的命令可能类似于C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe。 BTW,这不是一件容易的事,你应该深入阅读文档:

标签: python subprocess


【解决方案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
>

【讨论】:

  • 谢谢!但我不明白什么是 newdir = shlex.split(command)[1] 你能解释一下吗?此外,我不明白您是如何做到代码基于先前的结果来给出 cd 和 dir 的结果的? (代码有效,但我想了解您的工作)
  • 代码改进。链接到 shlex 文档(解析命令行和引号)。 cd somedir 是触发内部python os.chdir() 的特殊情况,因此下一个subprocess.Popen 命令在该新目录中执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 2013-07-19
  • 2011-12-30
  • 1970-01-01
  • 2019-01-13
  • 2017-01-09
  • 2018-12-21
相关资源
最近更新 更多