2010-08-29 73 views
54

这里是我的精简与非代码的东西setup.py脚本删除:MANIFEST.in忽略“python setup.py install” - 没有安装数据文件?

#!/usr/bin/env python 

from distutils.core import setup 
from whyteboard.misc import meta 


setup(
    name = 'Whyteboard', 
    version = meta.version, 

    packages = ['whyteboard', 'whyteboard.gui', 'whyteboard.lib', 'whyteboard.lib.pubsub', 
       'whyteboard.lib.pubsub.core', 'whyteboard.lib.pubsub.utils', 'whyteboard.misc'], 

    py_modules = ['whyteboard'], 
    scripts = ['whyteboard.py'], 
) 

MANIFEST.in:

include *.txt 
include whyteboard-help/*.* 
recursive-include locale *.mo 
recursive-include images *.png 

当我运行 “蟒蛇的setup.py安装sdist” 我得到一个用“whyteboard-0.41”根文件夹,里面带有我的locale/images /和whyteboard-help /文件夹,很好.tar.gz。这也有我的whyteboard.py脚本,它从whyteboard源码包中启动我的程序。

所以:

whyteboard/ 
├── locale/ 
├── images 
├── whyteboard-help/ 
├── whyteboard/ 
│ ├── __init__.py 
│ └── other packages etc 
├── whyteboard.py 
├── README 
├── setup.py 
└── CHANGELOG 

这反映了我的计划之源,是一切应该如何,并且是正确的。

但是,当我运行“python setup.py install”时,我的数据文件都没有写入 - 只有“whyteboard”源代码包和whyteboard.py放在/usr/local/lib/python2.6/中DIST-包/。

理想情况下,我想要与在dist-packages中创建的.tar.gz文件中生成的目录结构相同的目录结构,因为这是我的程序期望寻找其资源的方式。

如何获得“安装”来创建此目录结构?据我所知,似乎忽略了我的清单文件。

回答

21

除了一些注意事项,以奈德的回答(这击中的核心问题):

的Distutils内不site-packages(或dist-packages在Debian/Ubuntu的)安装在每个项目子目录里面的Python包和模块:他们正如你所见,直接安装到site-packages。因此,sdist中包含的whyteboard-xx目录不会以最终安装的形式存在。这

一个含义是,你应该小心命名您的data_files在澄清它们属于什么项目,因为这些文件/目录直接安装到全球site-packages目录,而不是内部的任何含whyteboard目录的方式。

或者您可以改为使用whyteboard程序包的数据package_data(这意味着它需要位于该程序包内,即在__init__.py旁边),然后这不是问题。

最后,在packages中同时包含whyteboard.py模块py_moduleswhyteboard/__init__.py包没有多大意义。这两者是相互排斥的,如果两者都有,那么whyteboard.py模块将被导入忽略,以支持相同名称的包。

如果whyteboard.py只是一个脚本,并且不打算导入,那么您应该使用scripts选项,并将其从py_modules中删除。

+1

这很不幸。我不喜欢有包数据的想法 - 对我来说,这些资源更适合生活在源目录之外。我也不喜欢必须拥有以程序名称为前缀的目录名称(即使我已经为帮助文件执行此操作)。嗯.. – 2010-08-30 14:30:13

48

MANIFEST.in告诉Distutils哪些文件要包含在源码分发中,但它不会直接影响安装的文件。为此,您需要在setup.py文件中包含相应的文件,通常为package dataadditional files

+0

我试着添加一个包数据列表,但没有使用我指定的文件。我不确定这些文件的位置是否相对于整个安装包安装。无论如何,它仍然没有在我期望的正确的目录结构中写入我的文件。 – 2010-08-30 13:24:02

+0

此答案中链接的文档为您提供了有关安装data_files和package_data的所有信息。如果这些选项不适合您,请使用您尝试的确切语法,结果以及您的预期更新您的问题。 – 2010-08-30 13:29:59

+3

这适用于我:在setup.py的data_packages里面复制我的MANIFEST.in条目可以使所有的东西都起作用。谢谢奈德 - 我多年来都没有理解这一点。希望现在我的distutils/setuptools /发布经验会更有意义。 – 2011-03-04 09:07:54

8

在Mac OSX上运行python 2.6.1,除了在setup.py中使用data_files参数,我绝对没有运气。所有与MANIFEST.in一起简单地导致文件被包含在dist包中,但从未安装。我检查了一些其他软件包,他们确实使用data_files来指定其他文件。

我创建了一个简短的功能,以帮助枚举

从目录树中的所有文件(TARGET_DIR,[文件列表])格式data_files预计:

def gen_data_files(*dirs): 
    results = [] 

    for src_dir in dirs: 
     for root,dirs,files in os.walk(src_dir): 
      results.append((root, map(lambda f:root + "/" + f, files))) 
    return results 

现在我可以只需在我的设置调用中调用此函数:

setup(... data_files = gen_data_files("docs", "lib") ... 

并且安装了那些树中的所有内容。

+8

这很好,但是它安装在哪里?对于我来说,当使用“pip安装”时,我的data_files会进入我的virtualenv的根目录(即所有virtualenv的软件包共享一个目录)。如果使用“setup.py install”,那么我的data_files会进入“包/ .egg /“。如果这些文件是运行时需要的数据,那么在任何情况下,我的代码都无法找到这些文件,当然,我必须在运行时搜索这两个目录。如果这些文件是我的LICENSE文件,则无论如何,我的用户都可以从我的源代码获得LICENSE。困惑。 – 2012-02-12 11:57:52

7

你应该使用的setuptools:

#!/usr/bin/env python 

from setuptools import setup, find_packages 
from whyteboard.misc import meta 


setup(
    name = 'Whyteboard', 
    version = meta.version, 

    packages = find_packages(), 
    include_package_data=True, 

    py_modules = ['whyteboard'], 
    scripts = ['whyteboard.py'], 
) 

这是不实际使用清单文件中做的工作,但它包含所有需要的文件。

+1

不适用于我。必须使用MANIFEST文件 – warvariuc 2013-05-03 16:28:33

+0

这确实对我来说** setuptools **。我构建了Debian软件包,并且只有在添加了'include_package_data = Tru'后,我才看到'package_data'字典中列出的glade文件出现在正确的位置。 – mlt 2013-07-11 07:18:55

11

我不知道为什么我的MANIFEST.in文件被忽略,当我跑python setup.py install - 原来include_package_data=True解决了这个问题。 package_data选项实际上不是必需的。

+1

噢,我的上帝,我一直在努力挣扎数小时..非常感谢! – DenisFLASH 2016-11-10 13:39:21