I have App
dir inside Release
dir
$ cd Release
$ tree
.
`-- App
|-- App.exe
..........
and I am trying to create App-1.0.zip
in the Release
dir containg App
with all its content. That is after unpacking App-1.0.zip
I would get this App
dir.
I tried shutil.make_archive
but when I do this
import shutil
shutil.make_archive('App-1.0', 'zip', '.')
from Release
dir, I get 48 byte App-1.0.zip
inside App-1.0.zip
besides the App
dir. That is it adds this unfinished archive to itself.
Is there any way to avoid that except creating the archive in temp dir and moving?
I tried to set base_dir
and use App
as root_dir
shutil.make_archive('App-1.0', 'zip', 'App', 'App')
but I get error that App
is not found when I set base_dir
.
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'"
The same for '/App'
and './App'
. With full path it works, but I get all parent dirs, not just App
.
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Release/App
notRelease
. – Armorerroot_dir
toApp
. The doc tells you that it changes intoroot_dir
and then creates the archive file from there. @ekhumoro 's first example works because it doesn't changeroot_dir
. – Armorerroot_dir
toApp
and leave defaultbase_dir
(.
) then it simply puts all files (*.exe etc.) to the root of the archive. But I thought thatbase_dir
simply adds prefix (likeApp/
) and this path doesn't have to exist. – Landermake_archive
isn't very good. It useschdir
to go to the root directory, so it has to exist (and sincechdir
is global to the process, your whole program is no longer thread safe for file operations) and its documentation is quite confusing. – Armorer