启动外部程序而不对路径进行硬编码

时间:2017-08-15 09:06:11

标签: python windows subprocess

我正在制作一个应该在不同计算机上运行的GUI。在脚本中我需要打开一个外部程序并通过这个程序运行一个宏。我正在使用子进程来执行此操作。问题是没有硬编码路径我无法找到程序。我无法对路径进行硬编码,因为程序可能位于不同计算机上的不同目录中。这可能吗?

代码:

from subprocess import *

def call_dos(self, program, *args):

    proc = call([program, args])
    if proc:
        logging.warning('Calling failed')
    else:
        logging.info('Calling successful')

def partone(self, *args):
    try:
        self.call_dos("Myprogram.exe", r"C:\Mymacro.mko")
    finally:
        self.partone()

错误消息:

Traceback:
    'Calling failed'

感谢您的回复!

1 个答案:

答案 0 :(得分:1)

您必须检查Myprogram.exe是否可调用,即在系统路径中。

对于Windows,可以通过将exe所在的实际目录附加到PATH环境变量来在用户或系统环境中进行设置。

为了确保用户不会因为安装错误而责怪您的程序,您可以添加一项检查,以便错误是人类可读的:

import distutils.spawn
if not distutils.spawn.find_executable("Myprogram.exe"):
     raise Exception("{} is not in the path, add it to path and retry".format("Myprogram.exe"))

您还可以将程序与脚本(同一目录)一起分发,以确保找到它(如果不需要深度安装)。在这种情况下,请执行:

self.call_dos(os.path.join(os.path.dirname(__file__),"Myprogram.exe"), r"C:\Mymacro.mko")