Python distutils错误:"[目录] ...不存在或不是常规文件"

San*_*nta 26 python distutils

我们采取以下项目布局:

$ ls -R .
.:
package  setup.py

./package:
__init__.py  dir  file.dat  module.py

./package/dir:
tool1.dat  tool2.dat
Run Code Online (Sandbox Code Playgroud)

以下内容为setup.py:

$ cat setup.py 
from distutils.core import setup


setup(name='pyproj',
      version='0.1',

      packages=[
          'package',
      ],
      package_data={
          'package': [
              '*',
              'dir/*',
          ],
      },
     )
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我想在所有非Python文件package/package/dir/目录.但是,运行setup.py install会引发以下错误:

$ python setup.py install
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/package
copying package/module.py -> build/lib/package
copying package/__init__.py -> build/lib/package
error: can't copy 'package/dir': doesn't exist or not a regular file
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?

Jac*_*son 20

在你的package_data,你的'*'glob将匹配package/dir自己,并尝试将该目录复制为文件,导致失败.找到一个与目录不匹配的glob,沿着这些行package/dir重写setup.py:

from distutils.core import setup

setup(name='pyproj',
      version='0.1',

      packages=[
          'package',
      ],
      package_data={
          'package': [
              '*.dat',
              'dir/*'
          ],
      },
     )
Run Code Online (Sandbox Code Playgroud)

鉴于你的榜样,这只是改变'*''*.dat',虽然你可能需要改进你的水珠还不止这些,只是确保它不会匹配'dir'

  • 啊.谢谢.你是否知道在这个包中(在模块之上)指定"包含所有内容,递归地"是否有更优雅的方式? (6认同)
  • 你可能会使用MANIFEST.in文件逃脱,但遗憾的是比理想的更难(因为这个搜索http://www.google.se/search?q=distutils+package_data+include+directory显示,很多人正在问这个问题,并没有多少人得到答案).最全面的文档是这样的:http://docs.python.org/distutils/setupscript.html,但它写得不是很清楚(为了找到你的问题,我实际上是pdb'd到distutils源码) (2认同)