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

时间:2013-02-24 17:31:01

标签: python

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

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

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

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

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

3 个答案:

答案 0 :(得分:21)

在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 module,例如,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)阻塞,直到命令完成,如果命令以非零退出代码结束,则引发异常。

答案 1 :(得分:8)

使用此选项打开使用默认程序的任何文件:

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检查,请随时添加它们。这只会告诉你如何打开文件。

答案 2 :(得分:5)

通过一个例子扩展了FatalError的建议。

使用subprocessing而非os.system的另一个好处是它使用相同的跨平台语法(Windows上的os.system在开始时需要“开始”,而OS X要求和“开放”。不是一件大事,但要少记一件事。

使用subprocess.call打开文件。

启动程序所需要做的就是调用subprocess.call()并在list个参数中进行操作,其中第一个是程序的路径,其余的是您想要的其他参数供应给您正在推出的计划。

例如,要启动Notepad.exe

import subprocess
import os


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告诉目标程序在哪里找到要打开的文件。