0

尝试运行此程序时,我不断收到“找不到文件”错误。为什么它没有找到并分配绝对路径?这是我的代码:

    file = "/" + arr[2] + ".exe"
    print(file)
    path = os.path.abspath(file)
    print(path)
    subprocess.Popen(path)
    localtime = time.asctime(time.localtime(time.time()))
    print(arr[2] + " opened at " + localtime + "\n")

这是输出的内容:

/firefox.exe
C:\firefox.exe
Traceback (most recent call last):
File "C:\Python33\lib\subprocess.py", line 1090, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified

我正在尝试以编程方式找到基于用户输入的打开程序......也许我正在以错误的方式进行操作,但这就是有人建议这样做的方式。Firefox.exe 应该位于 C:/Program Files/Firefox/firefox.exe

任何帮助都会很棒!谢谢!

4

2 回答 2

3

尝试在 Windows 上打开程序的一种解决方案是仅搜索所有文件夹,从 C:/Program files/ 和 C:/Program Files (x86) 的基本目录开始。一个简单的解决方案可能如下所示:

for program_files in (os.path.join("C:", "Program\ Files"), os.path.join("C:", "Program\ Files\ (x86)"):
    for dir in os.listdir(program_files):
        if os.path.exists(os.path.join(program_files, dir, arr[2]) + ".exe"):
            subprocess.Popen(os.path.join(program_files, dir, arr[2]) + ".exe")

这只会将一个目录向下移动到 Program Files 目录,但它至少应该给出需要做的事情的要点,并为大多数情况提供一个简单的解决方案。我假设大多数程序倾向于将它们的可执行文件保存在第一个目录下。

作为一个快速的旁注:如果您正在创建一个可以在 32 位和 64 位版本的 Windows 上运行的应用程序,您将需要某种检查 Program Files (x86) 目录的存在,或者某种检查32 位与 64 位 Windows。该文件夹仅存在于 64 位版本的 Windows 上。

另外:您的方法不起作用的原因是因为您获得了 /firefox.exe 的绝对路径,它在 Unix 系统上表示计算机上的最低级目录。在 Windows 上,这将是 C:/。Python 通常以非常 Unix-ey 的方式工作,因此它假定您需要系统的根目录。

于 2012-10-30T03:19:14.693 回答
0

一旦我找到了路径,这就是我启动程序的方式,但是文件遍历/搜索算法超出了这个问题的范围。

#load this from a setting file later
programDict = {'firefox': r"C:/Program Files/Firefox/firefox.exe"}

if sys.argv[2] in programDict:
    subprocess.Popen(path)
于 2012-10-30T02:40:39.720 回答