0

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

我正在制作一个对文件执行不同压缩阶段的程序。这部分代码压缩为 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 创建一个 ziptemp/myFile.zip但不是 DMG temp/myFile.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,即使检查其他任何东西都拒绝它。此外,它告诉我重命名成功,即使它也没有出现在其他任何地方。

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

4

1 回答 1

1

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

在 Python 中使用外部命令的一种可靠方法是使用subprocess模块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"))
于 2017-09-26T19:56:47.297 回答