我已经发布了一个名为'超现实主义'的pypi模块,它会产生超现实的句子和错误信息。它包含一个SQLite3数据库,其中包含我的模块所需的所有单词和句子。
以下所有安装方法都可以正常运行:
python setup.py install
pip install superrealism
easy_install超现实主义
并且该模块工作正常。
然而,当安装到virtualenv时,事情就出错了。 surrealism.py安装到 C:\ Users \ me \ virtualenvs \ surrealism \ Lib \ site-packages ,但是 surrealism.sqlite 没有安装?
如果我运行python并尝试导入模块,我的模块在 C:\ Users \ me \ virtualenvs \ surrealism 创建一个名为 surrealism.sqlite 的新sqlite3数据库
我的setup.py的内容如下:
#!/usr/bin/env python
from setuptools import setup
long_desc = open('readme.rst').read()
setup(name = 'surrealism',
version = '0.5.2',
py_modules = ['surrealism'],
author = 'Morrolan',
author_email = 'morrolan@icloud.com',
url = 'https://github.com/Morrolan/surrealism',
license = 'GNU General Public License (GPL)',
description = 'Surreal sentence and error message generator.',
long_description = long_desc,
platforms = ['Windows','Unix','OS X'],
download_url = "https://pypi.python.org/pypi/surrealism/",
keywords = ["surreal", "surrealism", "error message"],
classifiers = [
"Programming Language :: Python",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.3",
"Development Status :: 4 - Beta",
"Environment :: Other Environment",
"Intended Audience :: Developers",
"Intended Audience :: Education",
"License :: OSI Approved :: GNU General Public License (GPL)",
"Operating System :: OS Independent",
"Topic :: Education",
"Topic :: Software Development :: Libraries :: Python Modules",
],
install_requires=['setuptools'],
)
在surrealism.py中,我以一种相当基本的方式引用/连接到SQLite3数据库:
CONN = sqlite3.connect('surrealism.sqlite')
但到目前为止它并没有给我带来任何问题。
有更明确的方式来引用surrealism.sqlite,还是我必须在setup.py中指定一些东西来强制安装?
亲切的问候, Morrolan
答案 0 :(得分:2)
关键问题正是你连接到sqlite数据库的方式;这将引用当前目录中的文件;,在调用它的程序尝试运行的任何地方。你想说的是
... sqlite3.connect(where_this_python_lib_is_installed + '...sqlite')
因此无论安装在哪里都无关紧要。使用pkg_resources
库有一种相当标准的方法可以做到这一点。由于我们试图发现一个sqlite数据库,这意味着我们需要一个真实的磁盘文件,而不是字符串或类文件对象;所以在pkg_resources.resource_filename
使用正确的方法,我们只需要将连接调用更改为:
from pkg_resources import resource_filename
CONN = sqlite3.connect(resource_filename(__name__, 'surrealism.sqlite'))
但等等......仅当包数据位于包中时才有效,但您目前有模块。但不是一个大问题;我们会将surrealism.py
重命名为surrealism/__init__.py
,将surrealism.sqlite
重命名为surrealism/surrealism.sqlite
,然后在MANIFEST.in
中进行相应的更改。我们还需要告诉setuptools。将setup.py中的py_modules=["surrealism"],
更改为packages=["surrealism"]
。
几乎就在那里,我们需要做的最后一件事就是让setuptools从源代码中实际安装该文件。第一个很明显,我们需要告诉它要复制哪些文件;添加
package_data={'surrealism': ['surrealism.sqlite']},
对于setup.py
,第二个变化更为微妙。在大多数情况下,setuptools
会尝试将包安装为zip文件。这通常是件好事;但在我们的例子中,我们需要将真实文件的文件名传递给sqlite.connect
,因此我们必须告诉它不要尝试压缩包。为此,只需添加
zip_safe=False,
到你的setup.py。