【发布时间】: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