Python 3:子进程,更改目录

时间:2018-02-02 04:51:12

标签: python python-3.x subprocess

我在C:/myproject/harry.py

中有一个主要项目

harry.py正在启动线程。

harry.py使用已建立的路径self.relativePath = os.path.dirname(sys.argv[0])每隔几秒保存并加载文本文档

在每个线程中,调用一个子进程来激活C:/myproject/betty/here.exe

中的命令行.exe文件

我尝试过各种各样的事情,例如:

my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
doit = subprocess.Popen('cd betty/', 'here.exe -command', env=my_env)
doit.wait()

my_env = os.environ
my_env["PATH"] = "/usr/sbin:/sbin:" + my_env["PATH"]
doit = subprocess.Popen('here.exe -command', cwd='C:/myproject/betty/')
doit.wait()

响应:

FileNotFoundError: [WinError 2] The system cannot find the file specified

是否可以使用自定义路径运行子文件夹内的子进程...这不会干扰已建立的路径self.relativePath

谢谢,

2 个答案:

答案 0 :(得分:3)

你非常接近:

> doit = subprocess.Popen('here.exe -command', cwd='C:/myproject/betty/')

如果您的命令被调用here.exe -command,这实际上会起作用,但当然,不存在这样的文件。你想要['here.exe', '-command'](或者更不安全和更低效地添加shell=True;但是真的,不要)。

似乎你忘了在这次尝试中传递env=my_env;虽然here.exe确实要求你修改PATH吗?如果确实如此,为每个新子流程重复创建一个新副本似乎有点浪费。

您还需要切换到subprocess.run()或其中一个旧包装器;你应该只使用库函数中的低级Popen()函数。

另一方面,here.exe确实需要在特定目录中运行,并且PATH上是否存在该目录? Windows有点奇怪,Windows程序员通常不了解基本的命令行可用性设计原则;但如果here.exe完全正确写入,也许你实际上正在寻找

s = subprocess.run(['c:/myproject/betty/here.exe', '-command'], env=my_env)

答案 1 :(得分:0)

我已经在主题的各种stackoverflow帖子的帮助下发现了答案,并且找到了可能的解决方案。这不容易!

self.relativePath = os.path.dirname(sys.argv[0])

self.relativePath1 = self.relativePath + '\\your_subdirectoryHERE\\'

确保包含双斜杠,以匹配os.path.dirname(sys.argv [0])

self.process = subprocess.Popen(self.relativePath1 + 'flare.exe -command', cwd=self.relativePath1)