CherryPy вмешивается в Скрученное закрытие в Windows

Для большей гибкости, например, выберите каталог / файл по имени, используйте:

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)
7
задан Eli Courtwright 2 July 2009 в 16:25
поделиться

1 ответ

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()
14
ответ дан 6 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: