代码之家  ›  专栏  ›  技术社区  ›  Steven Sproat

manifest.in在“python setup.py install”中被忽略-没有安装数据文件?

  •  68
  • Steven Sproat  · 技术社区  · 14 年前

    以下是我的精简版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帮助/文件夹。这还有我的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/中。

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

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

    5 回复  |  直到 7 年前
        1
  •  25
  •   Carl Meyer    8 年前

    除了Ned的回答(这涉及到核心问题),还有一些注释:

    distuils不在中的每个项目子目录内安装python包和模块。 site-packages (或) dist-packages 在debian/ubuntu上):它们直接安装到 站点包 如你所见。所以包含 whyteboard-xx SDIST中的目录在最终安装的表单中不存在。

    其中一个暗示是你应该小心地说出你的名字 data_files 以一种澄清它们属于哪个项目的方式,因为这些文件/目录直接安装到全局 站点包 目录,不在任何包含 whyteboard 目录。

    或者你可以做你的数据 package_data 白木板 包裹(这意味着它需要住在包裹内,即靠近 __init__.py 这不是问题。

    最后,两个都有可能 whyteboard.py 模块在 py_modules 和A whyteboard/__init__.py 包内 packages . 这两者是相互排斥的,如果两者都有,那么 怀旧的 导入将忽略模块,而改为使用相同名称的包。

    如果 怀旧的 只是一个脚本,不打算导入,则应使用 scripts 它的选项,并将其从 Py-模 .

        2
  •  55
  •   Ned Deily    14 年前

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

        3
  •  21
  •   Greg    9 年前

    我不明白为什么 MANIFEST.in 当我运行时文件被忽略 python setup.py install -结果 include_package_data=True 解决问题。这个 package_data 实际上并不需要选项。

        4
  •  8
  •   Scott Persinger    13 年前

    在MacOSX上运行python 2.6.1,除了使用 数据文件 setup.py中的参数。manifest.in的所有内容只会导致文件包含在dist包中,但从未安装。我检查了一些其他包,它们确实在使用数据文件来指定其他文件。

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

    (目标目录[文件列表]) 数据文件期望的格式:

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

    树上的一切都安装好了。

        5
  •  7
  •   Juho Rutila    11 年前

    您应该使用设置工具:

    #!/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'],
    )
    

    这实际上并不是使用清单文件来完成工作,而是包含所有需要的文件。