1

シュールな文とエラー メッセージを生成する「シュルレアリスム」というモジュールを pypi に公開しました。これには、モジュールに必要なすべての単語と文を含む SQLite3 データベースが含まれています。

次のインストール方法はすべて正常に機能します。

python setup.py インストール

pip install シュルレアリスム

easy_install シュルレアリスム

モジュールは正常に動作します。

ただし、virtualenv にインストールすると、問題が発生します。surrealism.py はC:\Users\me\virtualenvs\surrealism\Lib\site-packagesにインストールされますが、surrealism.sqliteはインストールされませんか?

Python を実行してモジュールをインポートしようとすると、私のモジュールはC:\Users\me\virtualenvs\surrealismsurrealism.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 で何かを指定する必要がありますか?

敬具、モロラン

4

1 に答える 1

3

重大な問題は、まさに 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.pysurrealism/__init__.pysurrealism.sqlitesurrealism/surrealism.sqlite適切な変更を加えMANIFEST.inます。また、これについて setuptools に伝える必要があります。py_modules=["surrealism"],setup.py を に変更しますpackages=["surrealism"]

あとは、setuptools を使ってソースからそのファイルを実際にインストールするだけです。1 つ目は非常に明白で、コピーするファイルを指定する必要があります。追加

package_data={'surrealism': ['surrealism.sqlite']},

あなたにとってsetup.py、2 番目の変更はより微妙です。ほとんどの場合、setuptoolsパッケージを zip ファイルとしてインストールしようとします。これは通常は良いことです。しかし、私たちの場合、実際のファイルのファイル名を に渡す必要があるsqlite.connectため、パッケージを圧縮しないように指示する必要があります。そのためには、追加するだけです

zip_safe=False,

あなたの setup.py に。

于 2013-08-20T15:29:36.820 に答える