【问题标题】:Open specific file type with Python script?使用 Python 脚本打开特定文件类型?
【发布时间】:2012-01-31 09:24:40
【问题描述】:

如何使 Python 脚本成为特定文件类型(例如 *.foo)的默认应用程序?例如,当我在 Finder / Explorer 中双击文件时,我希望文件在 Python 脚本中打开。

这可以在 Win 和/或 OS X 中实现吗?如果这很重要,该应用程序就是 PySide 应用程序。

【问题讨论】:

  • 调用 Java 存根对您有用吗? stackoverflow.com/questions/550329/… 否则,如果您想要一个便携式解决方案,我很确定您不走运。
  • 从那个问题中,我无法找到使用任何应用程序打开文件的方法。 .open 方法似乎只在默认应用程序中打开一个文件。即使可以,也不会是比我的答案更好的解决方案,因为您需要一个 java 应用程序来打开 python 脚本。

标签: python default file-association


【解决方案1】:

Mac OS X

Mac OS X 上,您可以使用 Automator 创建一个应用程序,该应用程序调用您的 python 应用程序并将输入文件路径作为字符串参数传递。在应用程序工作流向导中,添加动作“Run Shell Script”,选择Pass input:作为as arguments,并在文本框中添加:

python /path/to/my/app/myapp.py "$@"

"$@" 将输入(也称为所选文件)中的任何参数作为字符串传递。只要您的脚本设置为将输入 (sys.argv) 处理为字符串列表(第一个是 python 应用程序路径),它就可以工作。

当您保存 Automator 工作流程时,OS X 会将其视为任何其他应用程序,您可以将该应用程序设置为“*.foo”类型文件的默认应用程序。要将“*.foo”与该应用程序关联,请右键单击 .foo 文件 Get InfoOpen with: Other...,选择您在 Automator 中创建的应用程序,然后单击 Change All... 按钮。

窗口

类似但希望较少涉及的方法可能适用于 Windows。您可能可以使用以下内容创建一个批处理文件 (.bat):

python C:\path\to\my\app\myapp.py %*

%* 扩展到所有参数。

只要您可以将文件扩展名与该批处理文件相关联,那么您就可以这样做,这就是您的解决方案。但是,我还没有尝试过这个 Windows 解决方案,所以请谨慎对待。另一方面,我已经测试过 Mac 解决方案。

【讨论】:

    【解决方案2】:

    例如,这是我为之编写的通用解决方案: 1) 打开已复制到 Linux 机器的 Windows 桌面链接 (*.URL)。 要么 2) 打开已复制到 Windows 框的 Linux .Desktop 链接。

    这是处理这两种情况的 Python 脚本:

    # UseDesktopLink.py
    import sys
    import webbrowser
    script, filename = sys.argv
    file_object = open(filename,'r')
    for line in file_object:
        if line[0:4]=="URL=":
            url=line[4:]
            webbrowser.open_new(url)
    file_object.close()
    

    在 Windows 上,使用 Scott H 的方法(通过 bat 文件)来处理关联。

    在 Linux 上,右键单击 Windows URL 文件。选择属性,然后打开方式。单击添加以添加新应用程序。然后在“添加应用程序”窗口的底部,单击“使用自定义命令”。然后浏览到 UseDesktopLink.py 文件并单击打开。但在单击添加之前,在“使用自定义命令”下方的文本框中,将“python”放在文件名之前(不带引号)。然后点击添加并关闭。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:
      1. 找到任何类型为foo的文件
      2. 右击->Get Info或点击文件图标,然后点击获取信息或点击文件并点击Command+I
      3. 在出现的Open With 窗格中,选择python 二进制文件的路径
      4. 选择后,您可以点击change All按钮
      5. 它会要求确认,只需说continue

      【讨论】:

      • 有没有办法选择 *.py 文件而不是 *.app(来自 py2app 之类的?)?
      • 对于*.py 文件,您必须在步骤1 中使用.py 而不是foo 执行上述步骤
      • 这变得非常混乱。 OP 有一个 python 脚本,比如 myapp.py 并希望使用它来自动打开以 .foo 结尾的文件,例如 myfile.foo 或其他文件。使用此答案中的说明,但在步骤 3 中,不要将您的 .foo 文件与 python 二进制文件关联,只需将其与您的 python 应用程序的 .py 文件关联,例如myapp.py.
      • @SimonHibbs 当我进入第 3 步时,无法将任意文件类型与 .py 文件相关联,因为 OS X 不认为它是应用程序。您可以导航到查找器中的脚本,但它显示为灰色,因为它不是应用程序。我做错了吗?
      【解决方案4】:

      我自己在寻找答案时发现了这个老问题,我想我会分享我的解决方案。我使用一个简单的 c 程序将参数定向到 python 脚本,允许 python 脚本保留脚本,而不需要编译它来使事情正常工作。这是我的c程序:

      int main(int argc, char *argv[]){
          char cmd[0xFF];
          // For me, argv[1] is the location of the file that is being opened.  I'm not sure if this is different on other OSes
          snprintf(cmd,sizeof cmd,"python YOUR_PYTHON_SCRIPT_HERE.py -a %s", argv[1]);
          system(cmd);
          return 0;
      }
      

      然后我编译了 c 程序并将其设置为文件扩展名的默认应用程序。
      然后,在 Python 脚本 YOUR_PYTHON_SCRIPT_HERE.py 中,我收到如下参数:

      import sys
      assert len(sys.argv) > 2 # Breaks if you call the script without the arguments
      theFile = " ".join(sys.argv[2:]) # What the c program gives us 
      print(theFile) # Print it out to prove that it works
      

      theFile 将包含正在打开的文件的位置
      通过使用获取文件的内容:

      with open(theFile,"r") as f:
          fileContents = f.read()
      

      【讨论】:

        【解决方案5】:

        在 Windows 上:

        1. 右键单击文件(我在此示例中使用了.docx 文件)
        2. 选择Open with...
        3. 从应用程序列表中,选择python
        4. 可选:选择Always use the selected program to open this kind of file

        注意:这将在 python shell 的上下文中运行.docx 文件的内容。一旦完成对文件内容的评估,它将立即关闭。如果您想在文字处理器中编辑文件,或许您应该下载notepad++,并选择该应用程序作为默认应用程序。

        【讨论】:

        • OP 希望使用 他自己的 python 脚本打开特定的文件类型,而不是使用 python 本身。
        猜你喜欢
        • 1970-01-01
        • 2020-10-08
        • 1970-01-01
        • 2020-01-31
        • 2020-11-10
        • 2021-01-17
        • 1970-01-01
        • 1970-01-01
        • 2016-09-14
        相关资源
        最近更新 更多