0

私は物事を正しく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ファイルがあり、その中にパッケージ名のフォルダーがありますが、そのフォルダー内には、私が望んでいたようなパッケージ全体ではなく、2つのファイルsetup.pyPKG-INFO.

私は何を間違っていますか?どうすれば仕事をすることができsdistますか?

4

2 に答える 2

6

問題はここでよく説明されています:

Setuptools には、多くのサイレント エラー モードがあります。そのうちの 1 つは、sdist リリースにすべてのファイルを含めることに失敗したことです (完全に失敗というわけではありません。RTFM は可能ですが、デフォルトの動作は予想外です)。この投稿は、すべての問題を解決する新しい、より輝かしい Distribute ができるまで、この問題に対する google-yourself-answer として機能します。

コメントが指摘しているように、バグ (設計ミス) は実際には distutils にあります。

あなたが観察したように、私はあなたの問題を再現できます。つまり、ファイル名を少し短くします。

$ 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

1 つの解決策は、ディレクトリ レイアウトを次のように変更することです (現在の 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 に関する警告の 1 つを取り除きます -- MANIFEST.in の欠落に関する警告は明らかに残ります;-)。また、setup.py の 1 行を次のように変更します。

package_dir={'': '.'},

さて、 の後python setup.py sdist、まともな tarball を取得します:

$ 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 ファイルは引き続き現在のディレクトリに作成されますが、問題にならないことを願っています。

于 2009-10-24T18:41:34.160 に答える
4

これの代わりに:

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 ディレクトリ配下のパッケージを使用して配布してください。

于 2009-10-24T18:28:31.133 に答える