停止 shutil.make_archive 向自身添加存档

Stop shutil.make_archive adding archive to itself

我有 App 目录 Release 目录

$ cd Release
$ tree
.
`-- App
    |-- App.exe
    ..........

我正在尝试在包含 AppRelease 目录中创建 App-1.0.zip 及其所有内容。那是在解包后 App-1.0.zip 我会得到这个 App 目录。

我试过 shutil.make_archive 但是当我这样做时

import shutil

shutil.make_archive('App-1.0', 'zip', '.')

Release 目录,除了 App 目录外,我在 App-1.0.zip 中得到 48 字节 App-1.0.zip。那就是它将这个未完成的存档添加到自身。

除了在临时目录中创建存档并移动之外,还有什么方法可以避免这种情况吗?

我尝试设置 base_dir 并将 App 用作 root_dir

shutil.make_archive('App-1.0', 'zip', 'App', 'App')

但是当我设置 base_dir 时我得到错误提示 App 没有找到。

Traceback (most recent call last):
  File ".......archive.py", line 4, in <module>
    shutil.make_archive('App-1.0', 'zip', 'App', 'App')
  File "C:\Users\Alex\.virtualenvs\....-nAKWzegL\lib\shutil.py", line 800, in make_archive
    filename = func(base_name, base_dir, **kwargs)
  File "C:\Users\Alex\.virtualenvs\....-nAKWzegL\lib\shutil.py", line 686, in _make_zipfile
    zf.write(path, path)
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python36-32\Lib\zipfile.py", line 1594, in write
    zinfo = ZipInfo.from_file(filename, arcname)
  File "C:\Users\Alex\AppData\Local\Programs\Python\Python36-32\Lib\zipfile.py", line 484, in from_file
    st = os.stat(filename)
FileNotFoundError: [WinError 2] The system cannot find the file specified: "'App'"

'/App''./App' 相同。使用完整路径它可以工作,但我得到了所有父目录,而不仅仅是 App.

Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32

这里有几个对我有用的解决方案:

# curdir: Release
shutil.make_archive('App-1.0', 'zip', '.', 'App')

# curdir: ../Release
shutil.make_archive('Release/App-1.0', 'zip', 'Release', 'App')

我在与它斗争的过程中学到的是:

shutil.make_archive('App-1.0', 'zip', '.', 'App')

虽然 'App-1.0' 在技术上是 "filename",但它必须表示为不带扩展名 ('c:\myfiles\myzipfile') 的文件路径。我还没有玩过路径名的所有变体,所以一些快捷方式可能有效(例如:'Release/App-1.0')。