Что не так с этим `setup.py`? - PullRequest
       36

Что не так с этим `setup.py`?

0 голосов
/ 24 октября 2009

У меня были проблемы с получением setup.py, чтобы правильно выполнить sdist. Я свел это к этому. У меня есть следующая структура каталогов:

my_package\
    my_subpackage\
        __init__.py
        deep_module.py
    __init__.py
    module.py
    setup.py

А вот что у меня есть в setup.py:

#!/usr/bin/env python

from distutils.core import setup
import distutils

setup(
    name='a',
    version='0.1',
    description='a',
    author='a',
    author_email='a@a.com',
    url='http://a.org',
    packages=['my_package','my_package.my_subpackage'],
    package_dir={'': '..'},
    license= "a",
    long_description = 'aaa',

)

(Материал 'aaa' просто заполнитель.)

В любом случае, все работает нормально, когда я делаю setup.py install, но когда я пытаюсь сделать setup.py sdist, происходит несколько любопытных вещей:

  1. Файл MANIFEST создан.

  2. Копия папки my_package создается внутри существующей папки my_package (хотя, как мне кажется, в ней отсутствуют некоторые файлы, относящиеся к настройке). *

  3. Создается папка dist, внутри нее zip-файл, внутри нее папка с именем пакета, но внутри этой папки не весь пакет, как я надеялся, а только два файла setup.py и PKG-INFO.

Что я делаю не так? Как мне заставить sdist работать?

Ответы [ 2 ]

6 голосов
/ 24 октября 2009

Проблема хорошо объяснена здесь :

У Setuptools много сбоев режимы. Одним из них является неспособность включить все файлы в выпуск sdist (ну не совсем провал, вы могли бы RTFM, но поведение по умолчанию неожиданный). Этот пост будет служить гугл-сам-ответь за это проблема, пока мы не получим новый, блестящий, Распределить решение всех наших проблемы.

Как отмечается в комментариях, ошибка (неправильный дизайн) на самом деле в distutils - setuptools просто не может ее исправить (если вы используете svn, все немного лучше)

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

$ ls -lR
total 8
-rw-r--r--  1 aleax  eng    0 Oct 24 11:25 __init__.py
-rw-r--r--  1 aleax  eng    0 Oct 24 11:25 modu.py
drwxr-xr-x  4 aleax  eng  136 Oct 24 11:25 mysub
-rw-r--r--  1 aleax  eng  323 Oct 24 11:26 setup.py

./mysub:
total 0
-rw-r--r--  1 aleax  eng  0 Oct 24 11:25 __init__.py
-rw-r--r--  1 aleax  eng  0 Oct 24 11:25 deepmod.py

и выполнение python setup.py sdist выдает (а также предупреждения):

$ ls -lR
total 16
-rw-r--r--  1 aleax  eng  104 Oct 24 11:35 MANIFEST
-rw-r--r--  2 aleax  eng    0 Oct 24 11:25 __init__.py
drwxr-xr-x  3 aleax  eng  102 Oct 24 11:35 dist
-rw-r--r--  2 aleax  eng    0 Oct 24 11:25 modu.py
drwxr-xr-x  5 aleax  eng  170 Oct 24 11:35 mypack
drwxr-xr-x  4 aleax  eng  136 Oct 24 11:25 mysub
-rw-r--r--  1 aleax  eng  323 Oct 24 11:26 setup.py

./dist:
total 8
-rw-r--r--  1 aleax  eng  483 Oct 24 11:35 a-0.1.tar.gz

./mypack:
total 0
-rw-r--r--  2 aleax  eng    0 Oct 24 11:25 __init__.py
-rw-r--r--  2 aleax  eng    0 Oct 24 11:25 modu.py
drwxr-xr-x  4 aleax  eng  136 Oct 24 11:35 mysub

./mypack/mysub:
total 0
-rw-r--r--  2 aleax  eng  0 Oct 24 11:25 __init__.py
-rw-r--r--  2 aleax  eng  0 Oct 24 11:25 deepmod.py

./mysub:
total 0
-rw-r--r--  2 aleax  eng  0 Oct 24 11:25 __init__.py
-rw-r--r--  2 aleax  eng  0 Oct 24 11:25 deepmod.py

Одним из решений является изменение макета каталога следующим образом (из текущего каталога mypack):

$ mkdir mypack
$ mv __init__.py modu.py mysub/ mypack
$ touch README.txt

так получается:

$ ls -lR
total 8
-rw-r--r--  1 aleax  eng    0 Oct 24 11:37 README.txt
drwxr-xr-x  5 aleax  eng  170 Oct 24 11:37 mypack
-rw-r--r--  1 aleax  eng  323 Oct 24 11:26 setup.py

./mypack:
total 0
-rw-r--r--  1 aleax  eng    0 Oct 24 11:25 __init__.py
-rw-r--r--  1 aleax  eng    0 Oct 24 11:25 modu.py
drwxr-xr-x  4 aleax  eng  136 Oct 24 11:25 mysub

./mypack/mysub:
total 0
-rw-r--r--  1 aleax  eng  0 Oct 24 11:25 __init__.py
-rw-r--r--  1 aleax  eng  0 Oct 24 11:25 deepmod.py

(и избавляясь от одного из предупреждений, одно о README - одно о пропущенном MANIFEST.in явно осталось ;-). Также измените одну строку setup.py на:

package_dir={'': '.'},

Теперь, после python setup.py sdist, вы получите приличный тарбол:

$ tar tvf dist/a-0.1.tar.gz 
drwxr-xr-x aleax/eng         0 2009-10-24 11:40:05 a-0.1/
drwxr-xr-x aleax/eng         0 2009-10-24 11:40:05 a-0.1/mypack/
-rw-r--r-- aleax/eng         0 2009-10-24 11:25:30 a-0.1/mypack/__init__.py
-rw-r--r-- aleax/eng         0 2009-10-24 11:25:30 a-0.1/mypack/modu.py
drwxr-xr-x aleax/eng         0 2009-10-24 11:40:05 a-0.1/mypack/mysub/
-rw-r--r-- aleax/eng         0 2009-10-24 11:25:30 a-0.1/mypack/mysub/__init__.py
-rw-r--r-- aleax/eng         0 2009-10-24 11:25:30 a-0.1/mypack/mysub/deepmod.py
-rw-r--r-- aleax/eng       156 2009-10-24 11:40:05 a-0.1/PKG-INFO
-rw-r--r-- aleax/eng         0 2009-10-24 11:37:41 a-0.1/README.txt
-rw-r--r-- aleax/eng       322 2009-10-24 11:39:46 a-0.1/setup.py

файл MANIFEST все еще создается в вашем текущем каталоге, конечно, но я надеюсь, что это не проблема.

4 голосов
/ 24 октября 2009

Вместо этого:

my_package\
    my_subpackage\
        __init__.py
        deep_module.py
    __init__.py
    module.py
    setup.py

Попробуйте это:

my_package_source\
    setup.py
    README.txt
    my_package\
        my_subpackage\
            __init__.py
            deep_module.py
        __init__.py
        module.py

На самом деле вам не нужен README, это просто для иллюстрации того, какие вещи находятся в корневом каталоге папки вашего проекта.

=== РЕДАКТИРОВАТЬ ============================================

Я должен уточнить. После запуска ваш каталог должен выглядеть примерно так:

my_package_source\
    setup.py
    README.txt
    MANIFEST
    PKG-INFO
    dist\
        my_package_0.X.tar.gz (or .zip on windows I believe)
    my_package\
        my_subpackage\
            __init__.py
            deep_module.py
        __init__.py
        module.py

Используйте пакет в каталоге dist для распространения.

...