【问题标题】:hdiutil creates a DMG when called directly but not from os.system()hdiutil 在直接调用而不是从 os.system() 调用时创建 DMG
【发布时间】:2017-09-25 06:33:35
【问题描述】:

编辑:我发现问题不在于这段代码,它实际上是一个稍后的简单问题,其行为方式与此处显示的类似。

我正在制作一个对文件执行不同压缩阶段的程序。这部分代码压缩为 ZIP,然后是 DMG,然后将文件重命名为一个扩展名。它在temp/ 目录中执行此操作。

我的代码:

from os import system as sysCmd
from os import rename, remove
import zipfile

...

# STEP 3 - create a zipfile
zip = zipfile.ZipFile(workDir + filename + ".zip", mode='w')
zip.write(workDir + filename + ".datei")
zip.close()

# STEP 4 - Compress to a DMG - THE PROBLEM IS HERE
sysCmd("hdiutil create -fs MS-DOS " + workDir + filename + ".dmg -srcfolder " + workDir + filename + ".zip")  # there is no more pythonesque way :(

# STEP 5  - Rename to  *.datei
remove(workDir + filename + ".datei")  # remove pre-existing datei
rename(workDir + filename + ".dmg", workDir + filename + ".datei")

问题:

它会创建一个 zip temp/myFile.zip,但不会从 zip temp/myFile.dmg 创建一个 DMG。

我当然会收到来自os.rename 的错误,因为该文件不存在:

created: /path/to/files/temp/README.dmg
Traceback (most recent call last):
  File "datei.py", line 59, in <module>
    rename(workDir + filename + ".dmg", workDir + filename + ".datei")
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/files/temp/README.dmg' -> '/path/to/files/temp/README.datei'

我尝试过的:

  • 我自己在命令行运行hidutil。它成功了!这让我想知道问题是否出在os.system()
  • 正在运行print(os.system("ls -al " + workDir))这告诉我有一个文件whatever.dmg,即使检查其他任何内容都会拒绝它。此外,它告诉我重命名成功,即使它也没有出现在其他任何地方。

非常感谢您的帮助,谢谢。

【问题讨论】:

  • 调用外部程序的“pythonesque”方式是使用subprocess。顺便说一句,您没有检查退出代码。
  • 顺便说一句,如果你正在使用的所有文件都在同一个地方,你可以考虑os.chdir()

标签: python dmg python-os


【解决方案1】:

您可能对文件的创建位置、名称等有些混淆。例如。如果你的路径有空格,命令行将被错误地解释,因为你没有对 shell 做任何引用或转义。

在 Python 中使用外部命令的可靠方法是使用 subprocess module 并自己构造 argv '因为您通常不需要 shell 干扰。始终检查程序的退出代码。

import subprocess
subprocess.check_call(("hdiutil","create",
        "-fs","MS-DOS",
        os.path.join(workDir, filename + ".dmg"),
        "-srcfolder", os.path.join(workDir, filename + ".zip")))

assert os.path.isfile(os.path.join(workDir, filename + ".dmg"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2012-08-04
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多