代码之家  ›  专栏  ›  技术社区  ›  Ram Rachum

这个“setup.py”有什么问题?

  •  0
  • Ram Rachum  · 技术社区  · 15 年前

    我一直都有问题 setup.py sdist 正确的事情。我把它煮成这个。我有以下目录结构:

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

    这就是我要的 Stuff.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 文件夹已创建 里面 现有的 Myo包 文件夹(尽管它遗漏了一些与安装相关的文件,我想。)

    3. dist 文件夹是创建的,里面有一个zipfile,里面有一个带有包名的文件夹,但是在这个文件夹里没有我希望的整个包,只有两个文件, Stuff.Py PKG-INFO .

    我做错什么了?我该怎么做 斯迪特 工作?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Eric Palakovich Carr    15 年前

    而不是这个:

    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
    

    实际上,您不需要自述,它只是为了说明什么样的东西位于项目文件夹的根目录中。

    ===编辑==============================

    我应该详细说明。运行之后,您的目录应该如下所示:

    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目录下的包进行分发。

        2
  •  6
  •   Alex Martelli    15 年前

    这个问题解释得很好 here :

    安装工具有许多无声故障 模式。其中之一是未能 包括SDIST版本中的所有文件 (不完全是失败,你可以 但默认行为是 意外的)这篇文章将作为 谷歌自己对此的答案 问题,直到我们有了新的,更亮的, 分配解决所有问题 问题。

    正如评论指出的那样,bug(设计错误)实际上在distuils中——安装工具无法修复它(如果您使用的是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
    

    (除去其中一个警告,一个关于自述的警告,一个关于丢失清单的警告,显然仍然存在;-)。同时将setup.py的一行更改为:

    package_dir={'': '.'},
    

    现在,之后 python安装.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
    

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