我正在使用
os.system(command)
调用python中的命令行程序。
如何在调用此命令时传递不同的文件夹以进行执行? 有一种系统调用可以实现这个吗?还是我应该保存当前文件夹,在执行后将其恢复。os.system(command)
调用python中的命令行程序。
如何在调用此命令时传递不同的文件夹以进行执行? 有一种系统调用可以实现这个吗?还是我应该保存当前文件夹,在执行后将其恢复。subprocess
模块是一个非常好的解决方案。
import subprocess
p = subprocess.Popen([command, argument1,...], cwd=working_directory)
p.wait()
此外,它还具有修改环境变量、将输入/输出重定向到调用程序等参数。
import shlex args = shlex.split('your long command --here with --params')
,它会显示给你如何分解它。 - Petershlex.split
可能很有用,但是如果存在未经检查的用户输入,其中可能包含反斜杠和引号,则仍然不安全。通过普通的str.split
拆分简单的命令字符串并将其与用户输入或路径名组合起来很容易,但是首先将这些字符串合并再通过shlex.split()拆分是不安全的。 - hynekcer在执行命令之前尝试使用os.chdir(path)
。
从这里获取信息:
os.chdir(path)将当前工作目录更改为path。
可用性:Unix,Windows
编辑
这会更改当前的工作目录,您可以通过以下方式获得当前的工作目录:
os.getcwd()
如果您想保存并稍后恢复它,如果您需要在原始工作目录中进行一些工作。
编辑2
无论如何,您应该考虑转到subprocess
(doc),如此处所建议的这里。 如果您使用subprocess
的Popen
,则可以选择提供cwd
参数以指定子进程的工作目录:阅读此内容。
subprocess.Popen(args, bufsize=0, executable=None, stdin=None,
stdout=None, stderr=None, preexec_fn=None, close_fds=False,
shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0)
...
如果cwd不是None,则在执行子进程之前将更改其当前目录为cwd。请注意,在搜索可执行文件时,不考虑此目录,因此您无法相对于cwd指定程序的路径。
os.system()
,那是唯一的方法。如果你可以考虑迁移到 subprocess
,你有 cwd
参数。 - zenpoy这里,我写了一个小函数来改变你正在工作的路径:
import os
def make_path(r_path):
ack = 1
try:
root = os.path.dirname(__file__)
rel_path = os.path.join("..", r_path)
abs_path = os.path.join(root, rel_path)
os.chdir(abs_path)
ack = 0
except Exception as details:
print('problem to get to the path '+r_path+' (0001) : ' + str(details))
return ack
所以这里,r_path
是你想要进入的相对路径。我向path.join()
方法中添加了".."
,所以如果你在一个文件夹中并且想在搜索路径之前退出该文件夹,则它会自动执行。所以,如果你的相对目录看起来像这样:
-path_to_reach
-a_random_file.txt
-your_current_folder
-your_program.py
您可以在 path_to_reach
中输入以下命令行,例如:
command = ls
make_path('path_to_reach/')
os.system(command)