我在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
时,会发生一些奇怪的事情:
创建MANIFEST
个文件。
在{/ 1}}文件夹中创建了<{1}}文件夹 的副本(虽然它错过了我认为的一些与设置相关的文件。)
创建一个my_package
文件夹,里面有一个zipfile,里面有一个包名称的文件夹,但是在那个文件夹里面没有像我希望的整个包,只有两个文件,{ {1}}和my_package
。
我做错了什么?如何让dist
工作?
答案 0 :(得分:6)
问题得到了很好的解释here:
Setuptools有许多无声失败 模式。其中一个是失败 包括sdist发行版中的所有文件 (不是完全失败,你可以 RTFM,但默认行为是 意外)。这篇文章将作为一个 google-yourself-answer for this 问题,直到我们变得新的,更光亮, 分配解决我们所有的问题 问题。
正如评论指出的那样,错误(错误设计)实际上是在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
(摆脱其中一个警告,一个关于自述文件 - 关于缺少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
当然,MANIFEST文件仍在当前目录中创建,但我希望这不是问题。
答案 1 :(得分: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
您实际上并不需要自述文件,这只是为了说明项目文件夹根目录中的内容。
===编辑======================================
我应该详细说明。运行它之后,你的目录应该是这样的:
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目录下的软件包进行分发。