当前位置:  开发笔记 > 编程语言 > 正文

MANIFEST.in在"python setup.py install"上忽略 - 没有安装数据文件?

如何解决《MANIFEST.in在"pythonsetup.pyinstall"上忽略-没有安装数据文件?》经验,为你挑选了5个好方法。

这是我删除的非代码内容的精简版setup.py脚本:

#!/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

当我运行"python setup.py install sdist"时,我得到一个很好的.tar.gz,带有"whyteboard-0.41"根文件夹,里面有我的locale/images /和whyteboard-help/folders.这也有我的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-packages/中.

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

如何通过"安装"来创建此目录结构?据我所知,似乎忽略了我的清单文件.



1> Ned Deily..:

MANIFEST.in告诉Distutils在源代码发布中包含哪些文件,但它不会直接影响安装的文件.为此,您需要在文件中包含相应的setup.py文件,通常作为包数据或附加文件.


这种能够将软件包含在无法安装的软件包中的设计是否有意义?什么时候用?
这对我有用:在setup.py的data_packages中复制我的MANIFEST.in条目会使一切正常.谢谢内德 - 我多年来都没有理解这一点.希望现在我的distutils/setuptools /分发经验会更有意义.

2> Carl Meyer..:

除了Ned的答案(其中涉及核心问题)之外的一些注释:

Distutils不会在site-packages(或dist-packagesDebian/Ubuntu)中的每个项目子目录中安装Python包和模块:site-packages正如您所见,它们直接安装在其中.因此,whyteboard-xxsdist中的包含目录将不会存在于最终安装的表单中.

这样做的一个含义是,您应该小心地data_files以一种澄清它们属于哪个项目的方式命名,因为这些文件/目录直接安装在全局site-packages目录中,而不是安装在任何包含whyteboard目录中.

或者你可以反而让你的数据package_data中的whyteboard包(这意味着它需要住那个包里面,也就是旁边__init__.py),然后这不是一个问题.

最后,同时包含whyteboard.py模块py_moduleswhyteboard/__init__.py包中没有多大意义packages.这两者是互斥的,如果你同时使用这两个whyteboard.py模块,那么导入将忽略模块,而使用相同名称的包.

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



3> Greg..:

MANIFEST.in当我跑步时,我无法弄清楚为什么我的文件被忽略了python setup.py install- 结果include_package_data=True解决了这个问题.package_data实际上并不需要该选项.



4> Scott Persin..:

在Mac OSX上运行python 2.6.1,除了在setup.py中使用data_files参数外,我绝对没有运气.使用MANIFEST.in的所有内容只会导致文件包含在dist包中,但从未安装过.我检查了一些其他软件包,他们确实使用data_files来指定其他文件.

我创建了一个简短的函数来帮助枚举目录树中的所有文件

data_files期望的(target_dir,[file list])格式:

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") ...

这些树中的所有东西都安装好了.


这很棒,但它安装在哪里?对我来说,当使用"pip install"时,我的data_files会进入我的virtualenv的根目录(即所有virtualenv包共享的单个目录.)如果使用"setup.py install",那么我的data_files进入"site-包/ .egg /".如果文件是运行时所需的数据,那么在任何情况下我的代码都找不到这些文件是微不足道的,当然我必须在运行时搜索这两个目录.如果这些文件是我的LICENSE文件,那么在这两种情况下,我的用户从我的来源到LICENSE都是微不足道的.困惑.

5> Juho Rutila..:

你应该使用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'],
)

这实际上并不是使用MANIFEST文件来完成这项工作,但它包含了所有需要的文件.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有