【问题标题】:How can I open files in external programs in Python? [duplicate]如何在 Python 中打开外部程序中的文件? [复制]
【发布时间】:2013-02-09 20:33:41
【问题描述】:

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

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

这是我目前所拥有的:

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

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

【问题讨论】:

  • 您可能应该提及您使用的平台。
  • 感谢 interjay,我可以使用该问题的答案

标签: python


【解决方案1】:

使用它打开任何带有默认程序的文件:

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 检查,请随时添加它们。这仅向您展示如何打开文件。

【讨论】:

  • os.system() 将阻塞调用线程。 subprocess 模块中的某些内容可能更合适。
  • 我不太需要添加程序名称,因为没有特定程序可打开的文件(例如 json)会导致问题
  • @LWH91 我建议添加检查文件是否以.json 结尾,如果是,请使用自定义程序打开文件。否则使用“开始”。
  • 是的,我打算对 json 和 html 进行双重检查,然后使用 else 打开其余部分
  • 这似乎仅限于 Windows
【解决方案2】:

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

使用subprocessing 而不是os.system 的另一个好处是它使用相同的跨平台语法(Windows 上的os.system 需要在开头使用“开始”,而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 告诉目标程序在哪里找到要打开的文件。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 唯一的问题是 json 文件没有默认应用程序,因此会出现一个框询问用户在哪个程序中打开它
    • @LWH91:我添加了基于子进程的解决方案来显式运行程序。
    • 你写道,“在 Windows 上你可以 [...]”os.startfile 在 Linux 机器上不起作用吗?
    • @ToothpickAnemone:是的,Linux 上没有os.startfile。按照答案中os.startfile() docs的链接(它说该功能仅在Windows上可用)
    • os.startfile 正是我想要的!
    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多