我想从用户的raw_input
提供一个目录,并通过python将cd
放到该目录
我使用了该代码,但它对我不起作用:
a=raw_input("Enter The Dir :")
import os
os.system("cd "+a)
但它并没有改变python程序的当前目录!
答案 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=)
首先会列出~
(也就是您的主目录)的内容,然后它会擦除主页。