【问题标题】:Stop shutil.make_archive adding archive to itself停止 shutil.make_archive 将存档添加到自身
【发布时间】:2018-09-03 04:54:03
【问题描述】:

我在Release 目录中有App 目录

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

我正在尝试在 Release 目录中创建 App-1.0.zip 包含 App 的所有内容。那是在解压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

【问题讨论】:

  • Read the docs: root_dir 是一个目录,它将成为存档的根目录;例如,我们通常在创建存档之前 chdir 进入 root_dir。 您告诉它在 Release/App 而不是 Release 中创建存档。
  • @tdelaney 你的意思是我的第二次尝试?是的,我知道,我正在尝试使用 base_dir 添加 App/ 前缀。
  • 不,在那次尝试中,您还将root_dir 设置为App。该文档告诉您它更改为root_dir,然后从那里创建存档文件。 @ekhumoro 的第一个示例有效,因为它不会更改 root_dir
  • @tdelaney 是的,如果我将root_dir 设置为App 并保留默认base_dir (.) 那么它只是将所有文件(*.exe 等)放到档案。但我认为base_dir 只是添加前缀(如App/),这条路径不必存在。
  • 是的,make_archive 不是很好。它使用chdir 进入根目录,因此它必须存在(并且由于chdir 对进程来说是全局的,因此您的整个程序对于文件操作不再是线程安全的)并且它的文档非常混乱。跨度>

标签: python python-3.x archive shutil


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

我在与此作斗争时学到的是:

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

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

【讨论】:

    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多