Для большей гибкости, например, выберите каталог / файл по имени, используйте:
import os
import zipfile
def zipall(ob, path, rel=""):
basename = os.path.basename(path)
if os.path.isdir(path):
if rel == "":
rel = basename
ob.write(path, os.path.join(rel))
for root, dirs, files in os.walk(path):
for d in dirs:
zipall(ob, os.path.join(root, d), os.path.join(rel, d))
for f in files:
ob.write(os.path.join(root, f), os.path.join(rel, f))
break
elif os.path.isfile(path):
ob.write(path, os.path.join(rel, basename))
else:
pass
Для дерева файлов:
.
├── dir
│ ├── dir2
│ │ └── file2.txt
│ ├── dir3
│ │ └── file3.txt
│ └── file.txt
├── dir4
│ ├── dir5
│ └── file4.txt
├── listdir.zip
├── main.py
├── root.txt
└── selective.zip
Вы можете, например, выберите только dir4
и root.txt
:
cwd = os.getcwd()
files = [os.path.join(cwd, f) for f in ['dir4', 'root.txt']]
with zipfile.ZipFile("selective.zip", "w" ) as myzip:
for f in files:
zipall(myzip, f)
Или просто listdir
в каталоге вызова скрипта и добавьте все оттуда:
with zipfile.ZipFile("listdir.zip", "w" ) as myzip:
for f in os.listdir():
if f == "listdir.zip":
# Creating a listdir.zip in the same directory
# will include listdir.zip inside itself, beware of this
continue
zipall(myzip, f)
CherryPy обрабатывает сигналы по умолчанию, когда вы вызываете быстрый запуск. В вашем случае вам, вероятно, следует просто развернуть быстрый запуск, который состоит всего из нескольких строк, и выбрать. Вот в основном то, что делает quickstart в магистрали:
if config:
cherrypy.config.update(config)
tree.mount(root, script_name, config)
if hasattr(engine, "signal_handler"):
engine.signal_handler.subscribe()
if hasattr(engine, "console_control_handler"):
engine.console_control_handler.subscribe()
engine.start()
engine.block()
В вашем случае вам не нужны обработчики сигналов, поэтому вы можете их опустить. Вам также не нужно вызывать engine.block, если вы не запускаете CherryPy из основного потока. Engine.block () - это просто способ заставить основной поток не завершаться немедленно, а вместо этого ждать завершения процесса (это значит, что автозагрузка работает надежно; на некоторых платформах возникают проблемы с вызовом execv из любого потока, кроме основного).
Если вы удалите вызов block (), вам даже не понадобится Thread () для быстрого запуска. Итак, замените вашу строку:
Thread(target=cherrypy.quickstart, args=[Root()]).start()
на:
cherrypy.tree.mount(Root())
cherrypy.engine.start()