0

純粋なモジュールとスクリプトの両方をすべて同じフォルダー内に含むPythonパッケージを作成しました。スクリプトはモジュール内の機能を利用する必要があるため、次のようにインポートするだけです。

import *module*

このパッケージを他の人と共有したいので、distutilsを使用して配布可能なパッケージに変換しました。distutilsのドキュメントの指示に従って、パッケージ内のスクリプトファイルを「setup.py」で次のように宣言しました。

setup(...,
    scripts=['path/to/script/a', 'path/to/script/b']
    )

このパッケージをインストールした後、distutilsがコマンドラインスクリプトのコピーをPythonインストール内の「Scripts」フォルダーにインストールしたことに気付きました。すべてうまくいっています。さて、これらのスクリプトのいずれかを実行しようとすると、次のように失敗します。

ImportError: No module named *module*

おそらくこれは、インストール後にスクリプトとモジュール間の相対パスが変更されたため、モジュールが見つからなくなったためです。だから私の質問は、同じパッケージ内のスクリプトからモジュールをインポートして、distutilsとのプレバンドルとポストインストールの両方で機能するようにするにはどうすればよいですか?

これで、モジュールのインポートを次のように変更することで、これを簡単に解決できます。

try:
    import *module*
except ImportError:
    from *package* import *module*

これはちょっとしたハックのようです。私はここでトリックを逃していますか?私はdistutilsが私のためにこれを処理することを期待していました。これを処理するためのより良い、より堅牢な方法はありますか?

4

1 に答える 1

0

たぶん試しsetuptoolsてみてください-メインスクリプトを自動的に作成するための優れた方法があります。簡単な例:

setup(
    # other arguments here...
    entry_points = {
        'console_scripts': [
            'foo = my_package.some_module:main_func',
            'bar = other_module:some_func',
        ],
        'gui_scripts': [
            'baz = my_package_gui.start_func',
        ]
    }
)
于 2012-08-30T13:07:33.830 に答える