回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我的问题是,当我将Python包上载到PyPI,然后使用pip从那里安装它时,我的应用程序会崩溃,因为它将我的文件安装到完全不同的位置,而不是从本地sdist安装完全相同的包。在</p>
<p>从本地sdist安装会将文件放在我的系统上,如下所示:</p>
<pre><code>/Python27/
Lib/
site-packages/
gloopy-0.1.alpha-py2.7.egg/ (egg and install info files)
data/ (images and shader source)
doc/ (html)
examples/ (.py scripts that use the library)
gloopy/ (source)
</code></pre>
<p>这和我所期望的一样,而且工作得很好(例如,我的源代码可以找到我的数据目录,因为它们彼此相邻,就像在开发中一样)</p>
<p>如果我将相同的sdist上载到PyPI,然后使用pip从那里安装它,那么情况看起来会非常不同:</p>
^{pr2}$
<p>这根本不起作用-我的应用程序找不到它的数据文件,而且很明显它很混乱,用我所有的垃圾文件污染了顶层/python27目录。在</p>
<p>我做错什么了?如何使pip安装的行为类似于本地sdist安装?这就是我应该努力实现的目标吗?在</p>
<h3>详情</h3>
<p>我已经安装了setuptools,还安装了distribute,我正在调用distribute_setup.使用_setuptools()</p>
<p>WindowsXP,Python2.7。在</p>
<p>我的开发目录如下所示:</p>
<pre><code>/gloopy
/data (image files and GLSL shader souce read at runtime)
/doc (html files)
/examples (some scripts to show off the library)
/gloopy (the library itself)
</code></pre>
<p>我的清单.in提到了我希望包含在sdist中的所有文件,包括data、examples和doc目录中的所有文件:</p>
<pre><code>recursive-include data *.*
recursive-include examples *.py
recursive-include doc/html *.html *.css *.js *.png
include LICENSE.txt
include TODO.txt
</code></pre>
<p>我的设置.py很冗长,但我想最好还是把它写在这里,对吧?我还包括对相同data/doc/examples目录的重复引用,如清单.in,因为我知道在安装过程中要将这些文件从sdist复制到系统中,需要这样做。在</p>
<pre><code>NAME = 'gloopy'
VERSION= __import__(NAME).VERSION
RELEASE = __import__(NAME).RELEASE
SCRIPT = None
CONSOLE = False
def main():
import sys
from pprint import pprint
from setup_utils import distribute_setup
from setup_utils.sdist_setup import get_sdist_config
distribute_setup.use_setuptools()
from setuptools import setup
description, long_description = read_description()
config = dict(
name=name,
version=version,
description=description,
long_description=long_description,
keywords='',
packages=find_packages(),
data_files=[
('examples', glob('examples/*.py')),
('data/shaders', glob('data/shaders/*.*')),
('doc', glob('doc/html/*.*')),
('doc/_images', glob('doc/html/_images/*.*')),
('doc/_modules', glob('doc/html/_modules/*.*')),
('doc/_modules/gloopy', glob('doc/html/_modules/gloopy/*.*')),
('doc/_modules/gloopy/geom', glob('doc/html/_modules/gloopy/geom/*.*')),
('doc/_modules/gloopy/move', glob('doc/html/_modules/gloopy/move/*.*')),
('doc/_modules/gloopy/shapes', glob('doc/html/_modules/gloopy/shapes/*.*')),
('doc/_modules/gloopy/util', glob('doc/html/_modules/gloopy/util/*.*')),
('doc/_modules/gloopy/view', glob('doc/html/_modules/gloopy/view/*.*')),
('doc/_static', glob('doc/html/_static/*.*')),
('doc/_api', glob('doc/html/_api/*.*')),
],
classifiers=[
'Development Status :: 1 - Planning',
'Intended Audience :: Developers',
'License :: OSI Approved :: BSD License',
'Operating System :: Microsoft :: Windows',
'Programming Language :: Python :: 2.7',
],
# see classifiers http://pypi.python.org/pypi?:action=list_classifiers
)
config.update(dict(
author='Jonathan Hartley',
author_email='tartley@tartley.com',
url='http://bitbucket.org/tartley/gloopy',
license='New BSD',
) )
if '--verbose' in sys.argv:
pprint(config)
setup(**config)
if __name__ == '__main__':
main()
</code></pre>