MANIFEST.in ignored on "python setup.py install" - brak zainstalowanych plików danych?

Oto mój rozebrany setup.py script with non-code stuff removed:

#!/usr/bin/env python

from distutils.core import setup
from whyteboard.misc import meta


setup(
    name = 'Whyteboard',
    version = meta.version,

    packages = ['whyteboard', 'whyteboard.gui', 'whyteboard.lib', 'whyteboard.lib.pubsub',
                'whyteboard.lib.pubsub.core', 'whyteboard.lib.pubsub.utils', 'whyteboard.misc'],

    py_modules = ['whyteboard'],
    scripts = ['whyteboard.py'],
)

MANIFEST.in:

include *.txt
include whyteboard-help/*.*
recursive-include locale *.mo
recursive-include images *.png

When I run "python setup.py zainstaluj sdist" dostaję ładny .smoła.gz z głównym folderem "whyteboard-0.41" , z folderami my locale / images / I whyteboard-help / wewnątrz. To ma również mój whyteboard.py skrypt uruchamiający mój program z pakietu źródłowego whyteboard.

Więc:

whyteboard/
 ├── locale/
 ├── images
 ├── whyteboard-help/
 ├── whyteboard/
 │  ├── __init__.py
 │  └── other packages etc
 ├── whyteboard.py
 ├── README
 ├── setup.py
 └── CHANGELOG
To odzwierciedla źródło mojego programu, tak wszystko powinno być, i jest poprawna.

Jednak gdy uruchamiam "python setup.py zainstalować" żaden z moich plików danych nie jest zapisywany - tylko pakiet źródłowy "whyteboard", a whyteboard.py jest umieszczony w /usr / local/lib/python2.6/dist-packages/.

Idealnie, chciałbym taką samą strukturę katalogów jak to, co zostało wygenerowane w .smoła.plik gz ma być utworzony w dist-packages, ponieważ tak mój program spodziewa się szukać swoich zasobów.

Jak mogę uzyskać "install", aby utworzyć tę strukturę katalogów? Wydaje się ignorować mój manifest, z tego co wiem.

Author: bschlueter, 2010-08-30

5 answers

Kilka uwag oprócz odpowiedzi Neda (która uderza w główny problem):

Distutils nie instaluje pakietów i modułów Pythona w podkatalogu per-project w site-packages (LUB dist-packages na Debianie/Ubuntu): są one instalowane bezpośrednio w site-packages, jak już widzieliście. Tak więc katalog zawierający whyteboard-xx w Twojej sdist nie będzie istniał w ostatecznej, zainstalowanej formie.

Jedną z sugestii jest to, że powinieneś być ostrożny, aby nazwać swój data_files w sposób, który wyjaśnia, jaki projekt należą do nich, ponieważ te pliki / katalogi są instalowane bezpośrednio w globalnym katalogu site-packages, a nie wewnątrz jakiegokolwiek katalogu zawierającego whyteboard.

Lub możesz zamiast tego utworzyć swoje dane package_data z whyteboard pakietu (co oznacza, że musi on mieszkać wewnątrz tego pakietu, tzn. obok __init__.py), a wtedy to nie jest problem.

Wreszcie, nie ma sensu mieć zarówno whyteboard.py moduł w py_modules, jak i whyteboard/__init__.py pakiet w packages. Te dwa wzajemnie się wykluczają, a jeśli masz oba, moduł whyteboard.py będzie ignorowany przez import na rzecz pakietu o tej samej nazwie.

Jeśli whyteboard.py jest tylko skryptem i nie jest przeznaczony do importowania, powinieneś użyć dla niego opcjiscripts i usunąć go z py_modules.

 24
Author: Carl Meyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-30 20:57:25

MANIFEST.in informuje Distutils, jakie pliki mają być zawarte w dystrybucji źródłowej, ale nie ma to bezpośredniego wpływu na to, jakie pliki są zainstalowane. W tym celu należy dołączyć odpowiednie pliki do pliku setup.py, zazwyczaj jako Dane pakietu lub jako dodatkowe pliki.

 51
Author: Ned Deily,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 01:09:13

Nie mogłem zrozumieć, dlaczego mój plik MANIFEST.in był ignorowany, gdy uruchomiłem python setup.py install - okazuje się, że include_package_data=True rozwiązuje problem. Opcja package_data nie jest w rzeczywistości wymagana.

 19
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-27 22:34:31

Uruchamiając Pythona 2.6.1 na Mac OSX, nie miałem absolutnie żadnego szczęścia poza użyciem parametru data_files w setup.py. wszystko z MANIFEST.in po prostu powodowało, że pliki były dołączane do pakietu dist, ale nigdy nie były instalowane. Sprawdziłem inne pakiety i rzeczywiście używały data_files do określania dodatkowych plików.

Stworzyłem krótką funkcję, która pomaga wyliczyć wszystkie pliki z drzewa katalogów w

(target_dir, [Lista plików]) format, który data_files:

def gen_data_files(*dirs):
    results = []

    for src_dir in dirs:
        for root,dirs,files in os.walk(src_dir):
            results.append((root, map(lambda f:root + "/" + f, files)))
    return results

Teraz mogę po prostu wywołać to w moim wywołaniu konfiguracji:

setup(... data_files = gen_data_files("docs", "lib") ...
I wszystko w tych drzewach zostanie zainstalowane.
 8
Author: Scott Persinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 19:30:31

Powinieneś użyć setuptools:

#!/usr/bin/env python

from setuptools import setup, find_packages
from whyteboard.misc import meta


setup(
  name = 'Whyteboard',
  version = meta.version,

  packages = find_packages(),
  include_package_data=True,

  py_modules = ['whyteboard'],
  scripts = ['whyteboard.py'],
)

W rzeczywistości nie jest to użycie pliku manifestu do wykonania zadania, ale zawiera wszystkie potrzebne pliki.

 7
Author: Juho Rutila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-07 07:14:16