19

今日の簡単な説明:Pythonのdistutilsライブラリのインとアウトを学習しています。パッケージにPython拡張モジュール(.pyd)を含めたいと思います。もちろん、推奨される方法は、パッケージの作成時にdistutilsに拡張機能をコンパイルさせることですが、これは多くのソースファイルにまたがり、いくつかの外部ライブラリを参照するかなり複雑な拡張機能であるため、すべてを取得するにはかなりの作業が必要になります。正しく機能しています。

それまでの間、私はVisual Studioから出てくる拡張機能の既知の動作ビルドを持っており、他の問題に集中できるようにするための一時的な解決策としてインストーラーで使用したいと思います。ただし、モジュールとして指定することはできません。これは、明示的な.py拡張子が必要なためです。setup.pyで、コンパイル済みの拡張モジュールを含めることをどのように示すことができますか?

(Python 3.1、重要な場合)

4

5 に答える 5

9

マニフェストテンプレートを試してください:

http://docs.python.org/distutils/sourcedist.html#specifying-the-files-to-distribute

于 2010-03-15T03:13:47.400 に答える
8

Extension.build_extensionをオーバーライドすることでこれを解決しました:

setup_args = { ... }
if platform.system() == 'Windows':
    class my_build_ext(build_ext):
        def build_extension(self, ext):
            ''' Copies the already-compiled pyd
            '''
            import shutil
            import os.path
            try:
                os.makedirs(os.path.dirname(self.get_ext_fullpath(ext.name)))
            except WindowsError, e:
                if e.winerror != 183: # already exists
                    raise


            shutil.copyfile(os.path.join(this_dir, r'..\..\bin\Python%d%d\my.pyd' % sys.version_info[0:2]), self.get_ext_fullpath(ext.name))

    setup_args['cmdclass'] = {'build_ext': my_build_ext }

setup(**setup_args)
于 2012-08-17T19:33:55.387 に答える
1

Visual Studio 2017でPython3.7、CMake 3.15.3、Swig 4.0.1を使用して拡張ライブラリをビルドしているときに、この同じ問題が発生しました。ビルドシステムは、mymodule.py、_mymodule.lib、および_mymodule.pydの3つのファイルを生成します。試行錯誤の末、次の組み合わせが機能することがわかりました。

  1. パッケージをインストールすることを指定する「setup.cfg」ファイルを作成します。例えば:
    [metadata]
    name = mymodule
    version = 1.0

    [options]
    include_package_data = True
    package_dir=
        =src
    packages=mymodule
    python_requires '>=3.7'

    [options.package_data]
    * = *.pyd
  1. CMakeを変更して、次のように配布ディレクトリ構造を作成します。
    setup.py
    setup.cfg
    src/
        mymodule/
                 __init__.py
                 _mymodule.pyd
  1. 'setup.py'ファイルは簡単です。
    setup()

これには、CMakeで「mymodule.py」出力ファイルの名前を「init.py」に変更する必要があります。私はCMakeの「install」コマンドでこれを行いました:


    install (TARGETS ${SWIG_MODULE_${PROJECT_NAME}_REAL_NAME} DESTINATION "${CMAKE_BINARY_DIR}/dist/src/${PROJECT_NAME}")
    install (FILES 
            setup.py
            setup.cfg
            DESTINATION "${CMAKE_BINARY_DIR}/dist"
    )

    install (FILES
            ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.py
            DESTINATION "${CMAKE_BINARY_DIR}/dist/src/${PROJECT_NAME}"
            RENAME "__init__.py"

この作業を行う秘訣は、セットアップでPythonスクリプトとしてのデフォルトのビルド出力を使用するのではなく、ビルド出力をPythonパッケージとして再構築することであると思います。

于 2019-10-18T23:24:08.893 に答える
0

package_dataを使用してみてください:http://docs.python.org/distutils/setupscript#installing-package-data

于 2011-10-10T15:53:01.493 に答える
0

私も同じ問題を抱えていました。これが私にとってうまくいったことです。簡単な例のために、モジュールの名前を変更しました。

私のセットアップは次のとおりです。 最終的なファイル名がmyextension.pydの拡張機能をビルドするVisualStudio2017プロジェクト

次に、mypyモジュールのstubgenを使用して、このモジュールのスタブをローカルに作成しました。

これは私のファイルツリーです

myextension/__init__.pyi
myextension/submodule.pyi
setup.py
myextension.pyd

そしてこれがの内容ですsetup.py

from setuptools import setup, Distribution


class BinaryDistribution(Distribution):
    def has_ext_modules(foo):
        return True


setup(
    name='myextension',
    version='1.0.0',
    description='myextension Wrapper',
    packages=['', 'myextension'],
    package_data={
        'myextension': ['*.pyi'],
        '': ['myextension.pyd'],
    },
    distclass=BinaryDistribution
)

実行した後pip wheel .、必要なスタブと一緒にエクステンションを含むかなり素敵なホイールを手に入れました。

于 2021-10-18T21:42:21.620 に答える