17

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

我做了一些研究,人们提到了一个名为 的模块Image,但是当我尝试导入这个模块时,我得到了一个 ImportError。

这是我到目前为止所拥有的:

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

我还将有需要在记事本中打开的 HTML 和 JSON 文件。

4

3 回答 3

29

在 Windows 上,您可以使用os.startfile()默认应用程序打开文件:

import os
os.startfile(filename)

没有shutil.open()跨平台的。最接近的近似值是webbrowser.open()

import webbrowser
webbrowser.open(filename)

可能会open在 OS X、os.startfile()Windowsxdg-open或 Linux 上的类似命令上使用自动命令。

如果你想运行一个特定的应用程序,那么你可以使用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)阻塞直到命令完成,如果命令以非零退出代码完成则引发异常。

于 2013-02-24T18:37:29.463 回答
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)

此外,如果您在打开文件之前需要一些 if 检查,请随时添加它们。这仅向您展示如何打开文件。

于 2013-02-24T17:35:02.980 回答
5

用一个例子扩展 FatalError 的建议。

subprocessing使用而不是的另一个好处os.system是它使用相同的跨平台语法(os.system在 Windows 上需要一个“开始”在开头,而 OS X 需要一个“打开”。没什么大不了的,但要记住的事情少了) .

用 . 打开一个文件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])

传递多个参数和路径同样简单。只需将其他项目添加到列表中。


使用多个参数启动

例如,这会使用 Java 运行时环境的特定副本启动 JAR 文件。

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 针对我要启动的程序。Argument2 向该程序提供一个参数告诉它它将运行一个 JAR,最后 Argument3 告诉目标程序在哪里找到要打开的文件。

于 2013-02-24T18:15:34.107 回答