如何通过python执行命令?

时间:2014-06-15 06:52:41

标签: python command cd

我想从用户的raw_input提供一个目录,并通过python将cd放到该目录

我使用了该代码,但它对我不起作用:

a=raw_input("Enter The Dir :")
import os
os.system("cd "+a)

但它并没有改变python程序的当前目录!

1 个答案:

答案 0 :(得分:1)

如果要更改python程序的当前目录,请调用os.chdir

>>> import os
>>> os.getcwd()   # show current working directory (cwd)
'/home/username'
>>> os.chdir('Downloads')
>>> os.getcwd()
'/home/username/Downloads'

通过os.system运行cd命令不起作用,因为os.system执行在新shell中作为参数传递的命令行。来自文档:

  

在子shell中执行命令(字符串)。这是通过实现的   调用标准C函数system(),并具有相同的功能   限制。

cd命令实际 工作,问题是它更改了新创建的shell的当前目录 ,而不是当前正在运行的python进程。使用os.system('cd ' + x)与执行相同:

$$(cd Downloads)    #execute in a subshell
$pwd
/home/username

调用os.chdir时相当于:

$cd Downloads
$pwd
/home/username/Downloads

即。它实际上会根据需要更改当前的工作目录。


请注意,os.system应该避免。请改用subprocess模块。甚至在os.system的文档中也提到了这一点:

  

subprocess模块为产卵提供了更强大的功能   新流程并检索其结果; 使用该模块是   优先使用此功能。请参阅subprocess文档中的Replacing Older Functions with the subprocess Module部分   一些有用的食谱。

subprocess模块使您可以更好地控制命令的执行。 实际上,您当前的代码存在巨大的安全漏洞。例如,如果用户输入了一个名为(警告:不提供上述程序的路径。它会擦除您的主目录!):

~;rm -fr .

使用subprocess时,可以避免将其解释为shell命令。例如:

import subprocess

dir_name = raw_input('Insert directory: ')
subprocess.call(['ls', dirname])

当提供上述路径时,将简单地尝试列出名为~;rm -fr .的目录(有效的UNIX路径)的内容,该目录可能不存在。 虽然:

import os
dir_name = raw_input('Insert directory: ')
os.system('ls ' + dir_name=)

首先会列出~(也就是您的主目录)的内容,然后它会擦除主页。