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文件夹,里面有一个 zipfile,里面有一个带有包名的文件夹,但是在那个文件夹里面没有我希望的整个包,只有两个文件,setup.pyPKG-INFO.

我究竟做错了什么?我怎么做sdist

4

2 回答 2

6

这个问题在这里得到了很好的解释:

Setuptools 有许多静默故障模式。其中之一是未能在 sdist 版本中包含所有文件(不完全是失败,您可以使用 RTFM,但默认行为是意外的)。这篇文章将作为这个问题的 google-yourself 答案,直到我们获得新的、更闪亮的、分布式的解决我们所有的问题。

正如评论所指出的,错误(错误设计)实际上在 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,您确实得到了一个不错的 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

当然,清单文件仍然在您当前的目录中创建,但我希望这不是问题。

于 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 回答