我想知道如何在记事本和图片查看器等程序中打开文件,具体取决于文件的扩展名。我在Windows上使用Python 3.3。
我做了一些研究,人们提到了一个名为Image
的模块,但是当我尝试导入这个模块时,我得到一个ImportError。
这是我到目前为止所拥有的:
def openFile():
fileName = listbox_1.get(ACTIVE)
if fileName.endswith(".jpg"):
fileName.open()
我还将需要在记事本中打开HTML和JSON文件。
答案 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告诉目标程序在哪里找到要打开的文件。