hdiutil在直接调用时创建DMG,但不是从os.system()

时间:2017-09-25 06:33:35

标签: python dmg python-os

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

我正在制作一个程序,对文件执行不同的压缩阶段。这部分代码压缩为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,即使用其他任何内容进行检查都会拒绝它。此外,它告诉我重命名成功,即使它也没有出现在其他任何地方。

非常感谢帮助,谢谢。

1 个答案:

答案 0 :(得分: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"))