setup.py没有安装数据文件

时间:2012-06-27 22:44:46

标签: python python-2.7 distutils

我有一个Python库,除常规Python模块外,还有一些数据文件需要放在/usr/local/lib/python2.7/dist-package/mylibrary中。

不幸的是,我无法说服setup.py在那里实际安装数据文件。请注意,此行为正在安装 - 而不是sdist。

这是setup.py

的略微编辑版本
module_list = list_of_files

setup(name         ='Modules',
      version      ='1.33.7',
      description  ='My Sweet Module',
      author       ='PN',
      author_email ='email',
      url          ='url',
      packages     = ['my_module'],

# I tried this. It got installed in /usr/my_module. Not ok.

      # data_files   = [ ("my_module",  ["my_module/data1",
      #                                  "my_module/data2"])]

# This doesn't install it at all.
      package_data = {"my_module" : ["my_module/data1",
                                     "my_module/data2"] }
     )

这是在Python 2.7中(最终必须在2.6中运行),并且必须在10.04和12+之间的某些Ubuntu上运行。现在正在12.04开发它。

3 个答案:

答案 0 :(得分:17)

<强> UPD package_data接受格式{'package': ['list', 'of?', 'globs*']}的dict,因此要使其工作,应该指定相对于包dir的shell globs,而不是相对于分发根的文件路径。

data_files具有不同的含义,一般来说,应避免使用此参数。

使用setuptools,您只需include_package_data=True,但数据文件应位于版本控制系统下,setuptools已知(默认情况下,它仅识别CVS和SVN,安装setuptools-gitsetuptools-hg你使用git或hg ...)


使用setuptools,您可以:

- 在MANIFEST.im中:

    include my_module/data*

- 在setup.py中:

    setup(
        ...
        include_package_data = True,
        ...
    )

答案 1 :(得分:5)

http://docs.python.org/distutils/setupscript.html#installing-additional-files

  

如果directory是相对路径,则相对于该目录进行解释   安装前缀(用于纯Python包的Python的sys.prefix,   包含扩展模块的软件包的sys.exec_prefix。

这可能会这样做:

data_files   = [ ("my_module",  ["local/lib/python2.7/dist-package/my_module/data1",
                                 "local/lib/python2.7/dist-package/my_module/data2"])]

或者只是使用join来添加前缀:

data_dir = os.path.join(sys.prefix, "local/lib/python2.7/dist-package/my_module")
data_files   = [ ("my_module",  [os.path.join(data_dir, "data1"),
                                 os.path.join(data_dir, "data2")])]

答案 2 :(得分:0)

以下解决方案对我来说效果很好。 您应该在setup.py所在的目录中有MANIFEST.in文件。

将以下代码添加到清单文件

recursive-include mypackage *.json *.md # can be extended with more extensions or file names. 

另一种解决方案是将以下代码添加到MANIFEST.in文件中。

graft mypackage # will copy the entire package including non-python files. 
global-exclude __pyache__ *.txt # list files you dont want to include here. 

现在,当您执行pip安装时,将包含所有必需的文件。

希望这会有所帮助。

更新: 确保安装文件中还包含include_package_data=True