编辑:我发现问题不在于此代码,后来实际上是一个简单的问题,其行为方式与此处所示类似。
我正在制作一个程序,对文件执行不同的压缩阶段。这部分代码压缩为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
,即使用其他任何内容进行检查都会拒绝它。此外,它告诉我重命名成功,即使它也没有出现在其他任何地方。 非常感谢帮助,谢谢。
答案 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"))