【问题标题】:Python: subprocess with different working directory [duplicate]Python:具有不同工作目录的子进程[重复]
【发布时间】:2011-04-15 07:36:35
【问题描述】:

我在这个目录下有一个 python 脚本:

work/project/test/a.py

a.py 内部,我使用subprocess.POPEN 从另一个目录启动进程,

work/to_launch/file1.pl, file2.py, file3.py, ...

Python 代码:

subprocess.POPEN("usr/bin/perl ../to_launch/file1.pl") 

在工作/项目/下,我输入以下内容

[user@machine project]python test/a.py,

error "file2.py, '没有这样的文件或目录'"

如何添加work/to_launch/,以便找到这些依赖文件file2.py

【问题讨论】:

  • 你可以尝试在 Popen 中使用 cwd 参数:stackoverflow.com/questions/1685157/…
  • 在 Python 中使用 import os 然后 os.chdir('/tmp/yourdirectory') 这将为您的 python 脚本设置当前目录。

标签: python subprocess working-directory


【解决方案1】:

您的代码不起作用,因为相对路径相对于您当前的位置(test/a.py 上一级)可见。

sys.path[0] 中有当前运行脚本的路径。

使用os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch)relPathToLaunch = '../to_launch/file1.pl' 来获取您的file1.pl 的绝对路径并使用它运行perl

编辑:如果你想从它的目录启动 file1.pl 然后返回,只需记住你当前的工作目录然后切换回来:

origWD = os.getcwd() # remember our original working directory

os.chdir(os.path.join(os.path.abspath(sys.path[0]), relPathToLaunch))
subprocess.POPEN("usr/bin/perl ./file1.pl") 
[...]

os.chdir(origWD) # get back to our original working directory

【讨论】:

  • 很抱歉,可以找到并运行 file1.pl。因为我在“/work/project”目录下运行python,而不是在“work/project/test”目录下。问题是file1.pl调用的file2、file 3找不到。
  • 嗯,那你的file1.pl好像是Perl问题?
  • 嗨,eumiro,谢谢你的回答。但是,它并不能解决问题,因为所有其他文件file1.pl等都不在当前python工作目录下,而是都假设在/..../to_launch/目录下。例如在file1.pl中,它直接调用“./file3.py”,我不能在file1.pl中改变这个路径。简单总结一下,让我重新提出我的问题:在python中,如何调用另一个在另一个工作目录下运行的程序?
  • 啊好吧,所以如果你不能改变file1.pl并且这个file1.pl必须使用相对路径调用其他程序,那么你必须使用Python的os.chdir(path_of_file1_pl)将自己更改为file1.pl的目录和像在本地目录中一样运行file1.pl,即./file1.pl
  • 谢谢 eumiro。 chdir 是一种解决方案。但老实说,我对这个没有信心,因为我要在A/,B/,...下启动几个项目。所以这意味着,从我的 python 父进程,我首先 os.chdir(/work/to_launchA/),subprocess.POPEN("usr/bin/perl ./file1.pl"),然后改回原来的 WD,然后对 B、C 等重复此操作。我担心的是:我可以随时更改回原来的 WD 吗?我必须等待 B 或 C 完成吗?有没有其他办法,比如给A、B等设置一些变量,不用chdir就可以自动找到它们的WD。​​span>
【解决方案2】:

使用相对于脚本的路径,而不是当前工作目录

os.path.join(os.path.dirname(__file__), '../../to_launch/file1.pl)

另见我对Python: get path to file in sister directory?的回复

【讨论】:

  • 嗨,亚当,问题是 file1.py 需要调用其他文件,这些文件都在另一个工作目录下。请看我上面的评论。还是谢谢你的帖子。
【解决方案3】:

您可以使用此代码设置当前目录:

import os
os.chdir("/path/to/your/files")

【讨论】:

  • 好吧,好吧,我试过 os.chdir,这个命令似乎改变了我当前的工作目录。问题是我要lauch几个子进程,每个子进程都会调用各自目录下的代码,比如work/to_launch/A/file1.pl、file2.py等和work/to_launch/B/file1.pl .,文件2,文件3。 ...另外,如果我使用 chdir,我该如何改回来?我的意思是在我的程序中,我经常注入这些命令来来回切换。这不是很好。我想python应该有一些方法可以很容易地用来添加依赖目录。
  • 另外,我正在启动几个子进程,所以我不确定这对父进程和子进程应该如何工作
  • 所以假设 file1.pl 有绝对路径 /a/b/c/file1.pl 所以像这样运行你的命令 os.chdir("a/b/c/") 然后执行 file1。 pl 我认为它应该可以工作。
  • 你好,anijhaw,就像我上面说的,我不知道什么时候改回原来的WD。特别是,我的python只是一个启动程序,进程A,进程B,会继续运行。那么我如何以及何时可以在不影响 A 的情况下改回来?如果我一直在等待A,我该如何开始更改为B的WD来启动B?我个人认为,要么我出错,要么 python 不足以做到这一点(0.0...001% 的机会)。
猜你喜欢
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
相关资源
最近更新 更多