我想创建一个可以完全访问我的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")
感谢您的帮助!
答案 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
>