【问题标题】:Python: Failing to open a file using os.system()Python:无法使用 os.system() 打开文件
【发布时间】:2011-06-20 08:16:08
【问题描述】:

我正在编写一个 Python 脚本,它多次使用应用程序 pdftk 来执行一些操作。

例如,我可以在 windows 命令行 shell 中使用 pdftk 来合并两个 pdf 文件,如下所示:

pdftk 1.pdf 2.pdf cat output result.pdf

我想在我的 Python 脚本中间执行上述操作。以下是我尝试这样做的方法:

os.system('pdftk 1.pdf 2.pdf cat output result.pdf')

上述 pdftk 命令在 Windows shell 中完美运行。但是,当我尝试使用 Python 的os.system() 执行它时,它无法打开输入文件(1.pdf 和 2.pdf)。这是我在尝试使用 Python 的 os.system() 执行命令时从 pdftk 收到的错误消息:

错误:无法打开 PDF 文件: 1.pdf

错误:无法打开 PDF 文件: 2.pdf

为什么会这样?我该如何解决?

请注意:我知道有更好的方法可以将 pdf 文件与 Python 合并。我的问题不是关于合并 pdf 文件。那只是一个玩具例子。我想要实现的是使用 Python 执行 pdftk 和其他命令行应用程序的能力。

【问题讨论】:

  • 几乎可以肯定是目录路径的问题。您可以从 `C:` 或任何位置传入完整路径,或者确保从正确的目录开始。
  • 也可能是引用或shell变量插值问题。始终使用subprocess 模块而不是os.system 以避免此类问题。
  • @chmullig:你真的觉得我有那么愚蠢吗?好吧,原来我是。这个问题确实是一个路径问题。请重复您在回答问题时所说的话,我会接受。谢谢。
  • @Philipp:能否请您扩展您对使用 subprocess 而不是 os.system 的评论?为什么?有什么不同?谢谢。
  • 默认情况下,子进程不调用 shell [所以没有变量扩展等]。因此 shell 注入攻击失败了。

标签: python system cmd


【解决方案1】:

您可以使用subprocess 避免(潜在的)引用、转义等问题:

import subprocess

subprocess.call(['pdftk', '1.pdf', '2.pdf', 'cat', 'output', 'result.pdf'])

它与os.system 一样易于使用,如果您动态构建参数列表,则更容易。

【讨论】:

    【解决方案2】:

    您需要设置进程的当前工作目录。如果 .pdf 文件位于 /some/path/to/pdf/files/:

    >>> os.getcwd()
    '/home/vz0'
    >>> os.chdir('/some/path/to/pdf/files/')
    

    【讨论】:

      【解决方案3】:

      确保您在同一个当前工作目录中。

      我还发现使用 \\ 而不是 / 对我有帮助。

      【讨论】:

        猜你喜欢
        • 2018-04-01
        • 1970-01-01
        • 2016-01-15
        • 2017-05-19
        • 2013-02-01
        • 2016-12-21
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        相关资源
        最近更新 更多