【问题标题】:Command line execution in different folder在不同文件夹中执行命令行
【发布时间】:2012-11-24 12:47:00
【问题描述】:

我正在使用 os.system(command) 调用在 python 中调用命令行程序。

如何调用此命令并传递不同的文件夹以执行?有系统调用吗?或者我应该保存当前文件夹,并在执行后更改恢复它。

【问题讨论】:

  • 你要执行什么命令?

标签: python shell command-line


【解决方案1】:

在这里,我做了一个小函数来改变你正在处理的路径:

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)

这个命令没有用,但你明白了!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      在调用命令之前尝试os.chdir(path)

      来自here

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

      可用性:Unix、Windows

      编辑

      这将改变当前工作目录,你可以通过以下方式获取当前工作目录:

      os.getcwd()
      

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

      编辑 2

      在任何情况下,您都应该按照here 的建议移至subprocess (doc)。如果您使用subprocessPopen,您可以选择提供cwd 参数来指定子进程的工作目录:read this

      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。

      【讨论】:

      • 你读过这个问题吗?我知道这会奏效,但这不是一个好方法!
      • @Victor 阅读编辑...如果您需要os.system(),这是唯一的方法。如果你可以考虑搬到subprocess 你有cwd arg
      猜你喜欢
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 2022-06-20
      • 1970-01-01
      • 2023-03-06
      • 2017-04-04
      • 1970-01-01
      相关资源
      最近更新 更多