在不同文件夹中执行命令行

86
我正在使用os.system(command)调用python中的命令行程序。 如何在调用此命令时传递不同的文件夹以进行执行? 有一种系统调用可以实现这个吗?还是我应该保存当前文件夹,在执行后将其恢复。

你想要执行哪些命令? - Ashwini Chaudhary
3个回答

124

subprocess模块是一个非常好的解决方案。

import subprocess
p = subprocess.Popen([command, argument1,...], cwd=working_directory)
p.wait()

此外,它还具有修改环境变量、将输入/输出重定向到调用程序等参数。


1
有时候很难知道如何将命令行参数拆分成参数。运行import shlex args = shlex.split('your long command --here with --params'),它会显示给你如何分解它。 - Peter
是的,如果您需要拆分带引号和空格的参数等内容,则函数shlex.split可能很有用,但是如果存在未经检查的用户输入,其中可能包含反斜杠和引号,则仍然不安全。通过普通的str.split拆分简单的命令字符串并将其与用户输入或路径名组合起来很容易,但是首先将这些字符串合并再通过shlex.split()拆分是不安全的。 - hynekcer

28

在执行命令之前尝试使用os.chdir(path)

这里获取信息:

os.chdir(path)将当前工作目录更改为path。

可用性:Unix,Windows

编辑

这会更改当前的工作目录,您可以通过以下方式获得当前的工作目录:

os.getcwd()

如果您想保存并稍后恢复它,如果您需要在原始工作目录中进行一些工作。

编辑2

无论如何,您应该考虑转到subprocess (doc),如此处所建议的这里。 如果您使用subprocessPopen,则可以选择提供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指定程序的路径。


1
你读了这个问题吗?我知道这会起作用,但这不是一个好的方法! - Victor
2
@Victor 请查看修改...如果你需要使用 os.system(),那是唯一的方法。如果你可以考虑迁移到 subprocess,你有 cwd 参数。 - zenpoy

4

这里,我写了一个小函数来改变你正在工作的路径:

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)

这个命令本身可能没什么用处,但是你可以理解一下这个思路!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接