如何在Python中使用外部程序打开文件?

19 投票
3 回答
92101 浏览
提问于 2025-04-17 16:57

我想知道如何根据文件的扩展名在像记事本和图片查看器这样的程序中打开文件。我在Windows上使用Python 3.3。

我做了一些研究,有人提到一个叫做Image的模块,但当我尝试导入这个模块时,出现了ImportError错误。

这是我目前的代码:

def openFile():
    fileName = listbox_1.get(ACTIVE)
    if fileName.endswith(".jpg"):
        fileName.open()

我还会有HTML和JSON文件,需要在记事本中打开它们。

3 个回答

6

这里扩展一下FatalError的建议,并给个例子。

使用subprocessing而不是os.system的一个额外好处是,它在不同操作系统上使用相同的语法(在Windows上,os.system需要在开头加一个“start”,而在OS X上则需要加一个“open”。这虽然不是大问题,但至少少了一件需要记住的事情)。

subprocess.call打开文件。

要启动一个程序,你只需要调用subprocess.call(),并传入一个list(列表),列表的第一个元素是程序的路径,后面的元素是你想要传给这个程序的其他参数。

比如,要启动Notepad.exe,你可以这样做:

import subprocess    

path_to_notepad = 'C:\\Windows\\System32\\notepad.exe'
path_to_file = 'C:\\Users\\Desktop\\hello.txt'

subprocess.call([path_to_notepad, path_to_file])

如果要传多个参数和路径也很简单,只需在列表中添加更多的项目。


使用多个参数启动

import subprocess
import os

current_path = os.getcwd()
subprocess.call([current_path + '/contents/home/bin/java', # Param 1
                    '-jar', #Param2
                    current_path + '/Whoo.jar']) #param3

参数1是我想要启动的程序,参数2是给这个程序的一个指令,告诉它要运行一个JAR文件,最后参数3则告诉目标程序在哪里可以找到要打开的文件。

37

在Windows系统上,你可以使用os.startfile()这个方法来用默认的应用程序打开一个文件:

import os
os.startfile(filename)

不过没有一个叫shutil.open()的方法可以在不同的操作系统上都能使用。最接近的选择是webbrowser.open()

import webbrowser
webbrowser.open(filename)

这个方法在OS X上可能会自动使用open命令,在Windows上使用os.startfile(),在Linux上则可能使用xdg-open或类似的命令。

如果你想运行一个特定的应用程序,可以使用subprocess模块,比如说,Popen()可以让你启动一个程序,而不需要等它完成:

import subprocess

p = subprocess.Popen(["notepad.exe", fileName])
# ... do other things while notepad is running
returncode = p.wait() # wait for notepad to exit

使用subprocess模块来运行程序的方法有很多,比如subprocess.check_call(command)这个方法会一直等到命令执行完毕,如果命令执行后返回的结果不是零,它会抛出一个异常。

12

用这个方法可以用默认程序打开任何文件:

import os
def openFile():
    fileName = listbox_1.get(ACTIVE)
    os.system("start " + fileName)

如果你想用特定的程序,比如记事本,可以这样做:

import os
def openFile():
    fileName = listbox_1.get(ACTIVE)
    os.system("notepad.exe " + fileName)

另外,如果在打开文件之前需要做一些判断,可以随意添加这些判断。这段代码只是告诉你怎么打开文件。

撰写回答