4

build_extピップフレンドリーにしようとしているファンキーな拡張機能を構築するためのカスタムを定義しました。以下は、私がやっていることのトリミングされたバージョンです。

foo_ext = Extension(
  name='foo/_foo',
  sources=foo_sources,
)

class MyBuildExt(build_ext):
  def build_extension(self, ext):
    # This standalone script builds the __init__.py file 
    #  and some .h files for the extension
    check_call(['python', 'build_init_file.py'])

    # Now that we've created all the init and .h code
    #  build the C/C++ extension using setuptools/distutils
    build_ext.build_extension(self, ext)

    # Include the generated __init__.py in the build directory 
    #  which is something like `build/lib.linux-x86/foo/`.  
    #  How can I get setuptools/distutils to install the 
    #  generated file automatically?!
    generated_file = 'Source/foo/__init__.py'
    output_path = '/'.join(self.get_outputs()[0].split('/')[:-1])
    self.move_file(generated_file, output_path)

setup(
    ...,
    ext_modules = [foo_ext],
    cmdclass={'build_ext' : MyBuildExt},
)

このモジュールをパッケージ化して pip でインストールするとfoo、virtualenv の site-packages ディレクトリにモジュールができました。ディレクトリ構造は次のようになります。

foo/
foo/__init__.py
foo/_foo.so

このegg-info/SOURCES.txtファイルには、手動で作成/移動したファイルが含まれていません。コマンド__init__.pyを実行すると、virtualenv のサイト パッケージに残ります。pip でパッケージ全体を削除したいと思います。ビルド ディレクトリに手動で移動した生成ファイルを、インストールされている出力ファイルのリストに追加するにはどうすればよいですか?pip uninstall foofoo/__init__.py__init__.py

これは嫌でハッキーだと思うので、嫌でハッキーな答えを歓迎します!

試み:

  1. 追加packages=['foo']-- 私がそうすると、pip は拡張機能をビルドしません。また、パッケージ名のファイル パス/名前空間のバージョンを調整しようとしましたが、違いはありません。
4

2 に答える 2

5

distutils に Python パッケージをインストールさせるには、渡す必要がありpackages=['foo']ます。プロジェクトのルート レベルではない場所 (setup.py スクリプトの隣の foo ディレクトリ) に配置する場合は、ここで行うには、渡すpackage_dir={'foo': 'Source'}か、より単純なレイアウトを使用する必要があります。setup.py スクリプトにこのpackagesパラメーターが含まれている場合、ビルド コマンドは build_py コマンドを呼び出して、Python ソース ファイル (およびディレクトリ) をビルド ディレクトリに移動します。このディレクトリは、後で install コマンドによってコピーされます。

ここでの問題はfoo/__init__.py、build_py の後に実行される build_ext コマンドによってファイルがビルドされることです。カスタムビルドコマンドでそれをオーバーライドする必要があります:

class MyBuild(build):
  sub_commands = [('build_clib', build.has_c_libraries),
                  ('build_ext', build.has_ext_modules),
                  ('build_py', build.has_pure_modules),
                  ('build_scripts', build.has_scripts),
                 ]

setup(..., cmdclass={'build': MyBuild, 'build_ext': MyBuildExt})

sub_commands 属性の要素は、(コマンド名、コマンドを実行するかどうかを決定するために呼び出す関数) のタプルです。これはソースコードに記載されていますが、ドキュメントで説明されているかどうかは覚えていません。標準のビルド クラスでは、build_py が build_clib よりも優先されます。Python 2.7 の次のバージョンではこれを変更するかもしれません.

于 2012-05-16T04:34:19.347 に答える
1

まず、Extension インスタンスの name パラメータは、パスではなくモジュール名 (foo._foo) にする必要があります。

setup 呼び出しに packages=['foo'] を追加してみましたか?

于 2012-05-12T03:56:24.783 に答える