2010-12-18 78 views
0

我正在使用以下脚本来创建python分发,为Pinax设置主题/模板。这些文件大多是HTML & JS,与Python文件有更多的配置目的:创建Python分发:包括HTML和JS等文件的问题

import os 
import sys 
from fnmatch import fnmatchcase 
from distutils.util import convert_path 
from setuptools import setup, find_packages 

VERSION = __import__('pinax-designer-theme').__version__ 

def read(*path): 
    return open(os.path.join(os.path.abspath(os.path.dirname(__file__)), *path)).read() 

# Provided as an attribute, so you can append to these instead 
# of replicating them: 
standard_exclude = ('*.py', '*.pyc', '*~', '.*', '*.bak') 
standard_exclude_directories = ('.*', 'CVS', '_darcs', './build', 
           './dist', 'EGG-INFO', '*.egg-info') 

# Copied from paste/util/finddata.py 
def find_package_data(where='.', package='', exclude=standard_exclude, 
     exclude_directories=standard_exclude_directories, 
     only_in_packages=False, show_ignored=False): 
    """ 
    Return a dictionary suitable for use in ``package_data`` 
    in a distutils ``setup.py`` file. 

    The dictionary looks like:: 

     {'package': [files]} 

    Where ``files`` is a list of all the files in that package that 
    don't match anything in ``exclude``. 

    If ``only_in_packages`` is true, then top-level directories that 
    are not packages won't be included (but directories under packages 
    will). 

    Directories matching any pattern in ``exclude_directories`` will 
    be ignored; by default directories with leading ``.``, ``CVS``, 
    and ``_darcs`` will be ignored. 

    If ``show_ignored`` is true, then all the files that aren't 
    included in package data are shown on stderr (for debugging 
    purposes). 

    Note patterns use wildcards, or can be exact paths (including 
    leading ``./``), and all searching is case-insensitive. 
    """ 

    out = {} 
    stack = [(convert_path(where), '', package, only_in_packages)] 
    while stack: 
     where, prefix, package, only_in_packages = stack.pop(0) 
     for name in os.listdir(where): 
      fn = os.path.join(where, name) 
      if os.path.isdir(fn): 
       bad_name = False 
       for pattern in exclude_directories: 
        if (fnmatchcase(name, pattern) 
         or fn.lower() == pattern.lower()): 
         bad_name = True 
         if show_ignored: 
          print >> sys.stderr, (
           "Directory %s ignored by pattern %s" 
           % (fn, pattern)) 
         break 
       if bad_name: 
        continue 
       if (os.path.isfile(os.path.join(fn, '__init__.py')) 
        and not prefix): 
        if not package: 
         new_package = name 
        else: 
         new_package = package + '.' + name 
        stack.append((fn, '', new_package, False)) 
       else: 
        stack.append((fn, prefix + name + '/', package, only_in_packages)) 
      elif package or not only_in_packages: 
       # is a file 
       bad_name = False 
       for pattern in exclude: 
        if (fnmatchcase(name, pattern) 
         or fn.lower() == pattern.lower()): 
         bad_name = True 
         if show_ignored: 
          print >> sys.stderr, (
           "File %s ignored by pattern %s" 
           % (fn, pattern)) 
         break 
       if bad_name: 
        continue 
       out.setdefault(package, []).append(prefix+name) 
    return out 

excluded_directories = standard_exclude_directories + ('./requirements', './scripts') 
package_data = find_package_data(exclude_directories=excluded_directories) 

setup(
    name='pinax-designer-theme', 
    version=VERSION, 
    description='Pinax Designer Theme is a designer framework of django HTML(5) templates and Less.js CSS files, including a CSS grid, for Pinax.', 
    long_description=read('docs', 'index.rst'), 
    author='Daryl Antony', 
    author_email='[email protected]', 
    maintainer='Daryl Antony', 
    maintainer_email='[email protected]', 
    url='http://commoncreative.com.au/', 
    packages=find_packages(), 
    package_data=package_data, 
    zip_safe=False, 
    # entry_points={ 
    #   # 'console_scripts': [ 
    #   #    'pinax-admin = pinax.core.management:execute_from_command_line', 
    #   #   ], 
    #  }, 
    classifiers=[ 
     'Development Status :: 3 - Alpha', 
     'Environment :: Web Environment', 
     'Intended Audience :: Developers', 
     'License :: OSI Approved :: MIT License', 
     'Operating System :: OS Independent', 
     'Framework :: Django', 
     'Programming Language :: Python', 
     'Programming Language :: Python :: 2.4', 
     'Programming Language :: JavaScript', 
    ], 
) 

这已被复制,并从实际Pinax setup.py修改。现在

,而package_data变量似乎包含所有必需的文件,这样做之后即:

import ipdb; ipdb.set_trace() 

,并找到package_data的是,内容是:中

http://dpaste.org/ojM0/

无这些文件,除了目录和* .py文件似乎实际上包含在软件包中。

所以问题是,我能做些什么来改变这种情况?为什么package_data变量的内容被忽略?

非常感谢!

回答

3

我相信你必须在MANIFEST.in中指定这些文件。

+0

嗯,手动,还是有人自动做到这一点? – Daryl 2010-12-18 09:52:28

+0

哦,我看到递归包含? – Daryl 2010-12-18 10:03:21

+0

我有同样的问题,我手动将文件包含在MANIFEST中,然后它可以工作...但是,这不可能是唯一的解决方案!否则为什么会有'package_data'参数?!? – sebpiq 2010-12-19 09:12:18