私はCythonを使ってPythonモジュールから共有オブジェクトを生成しています。コンパイル出力はbuild/lib.linux-x86_64-3.5/<Package>/<module>.cpython-35m-x86_64-linux-gnu.so
に書き込まれます。名前付けルールを変更するオプションはありますか?ファイルの名前を<module>.so
とし、インタプリタのバージョンやアーチの付録を付けないでください。.soファイルのCythonの命名規則を変更する
答えて
setuptools
のように見えますが、接尾辞を完全に変更または削除するオプションはありません。魔法がdistutils/command/build_ext.py
で起こる:私は、ビルド後の名前変更アクションを追加する必要がありますように
def get_ext_filename(self, ext_name):
from distutils.sysconfig import get_config_var
ext_path = ext_name.split('.')
ext_suffix = get_config_var('EXT_SUFFIX')
return os.path.join(*ext_path) + ext_suffix
思えます。 2016年8月12日から
更新:
[OK]を、私は実際にソリューションを投稿するのを忘れました。実際には、組み込みのinstall_lib
コマンドをオーバーロードすることによって名前変更アクションを実装しました。 setup
機能でコマンドをオーバーロードするために今あなたがしなければならないすべての
from distutils.command.install_lib import install_lib as _install_lib
def batch_rename(src, dst, src_dir_fd=None, dst_dir_fd=None):
'''Same as os.rename, but returns the renaming result.'''
os.rename(src, dst,
src_dir_fd=src_dir_fd,
dst_dir_fd=dst_dir_fd)
return dst
class _CommandInstallCythonized(_install_lib):
def __init__(self, *args, **kwargs):
_install_lib.__init__(self, *args, **kwargs)
def install(self):
# let the distutils' install_lib do the hard work
outfiles = _install_lib.install(self)
# batch rename the outfiles:
# for each file, match string between
# second last and last dot and trim it
matcher = re.compile('\.([^.]+)\.so$')
return [batch_rename(file, re.sub(matcher, '.so', file))
for file in outfiles]
されています:ここでは、論理だそれでも
setup(
...
cmdclass={
'install_lib': _CommandInstallCythonized,
},
...
)
、私は標準のコマンドをオーバーロードに満足していませんよ。あなたがより良い解決策を見つけたらそれを掲示し、私はあなたの答えを受け入れます。
この動作はdistutilsパッケージで定義されています。 Pythonの3.5 "EXT_SUFFIX" 変数は、例えば、プラットフォーム情報が含まれている」.cp35-win_amd64" を皮切り
# Lib\distutils\command\build_ext.py
def get_ext_filename(self, ext_name):
r"""Convert the name of an extension (eg. "foo.bar") into the name
of the file from which it will be loaded (eg. "foo/bar.so", or
"foo\bar.pyd").
"""
from distutils.sysconfig import get_config_var
ext_path = ext_name.split('.')
ext_suffix = get_config_var('EXT_SUFFIX')
return os.path.join(*ext_path) + ext_suffix
:distutilsのはのsysconfigと "EXT_SUFFIX" 設定変数を使用しています。
私は次の関数を書かれている:
def get_ext_filename_without_platform_suffix(filename):
name, ext = os.path.splitext(filename)
ext_suffix = sysconfig.get_config_var('EXT_SUFFIX')
if ext_suffix == ext:
return filename
ext_suffix = ext_suffix.replace(ext, '')
idx = name.find(ext_suffix)
if idx == -1:
return filename
else:
return name[:idx] + ext
とカスタムにbuild_extコマンド:
from Cython.Distutils import build_ext
class BuildExtWithoutPlatformSuffix(build_ext):
def get_ext_filename(self, ext_name):
filename = super().get_ext_filename(ext_name)
return get_ext_filename_without_platform_suffix(filename)
使用法:setuptoolsのは、ビルドオプションとして
setup(
...
cmdclass={'build_ext': BuildExtWithoutPlatformSuffix},
...
)
あなたのコードは私を助けました。ありがとうございました! – q0987
- 1. 命名規則
- 2. 命名規則
- 3. クラスコンストラクタ内の変数の命名規則
- 4. ココアのインスタンス変数の命名規則
- 5. Rails 5のファイル命名規則
- 6. 角4のファイル命名規則
- 7. 戦争ファイルの命名規則
- 8. Spring設定ファイルの命名規則
- 9. ビットマスクパラメータ命名規則?
- 10. serialVersionUID命名規則
- 11. JPasswordField命名規則
- 12. インテントキー命名規則
- 13. BEM:命名規則
- 14. Rails、命名規則
- 15. 変数\プロパティの命名規則
- 16. Go:スライス変数/パラメータの命名規則?
- 17. Oracleストアド・プロシージャ変数の命名規則
- 18. インスタンス変数への命名規則
- 19. ウェブサイトの命名規則
- 20. C#プロジェクトの命名規則
- 21. ベースファイルの命名規則
- 22. ベースコントローラーの命名規則
- 23. リポジトリの命名規則
- 24. Androidリソースの命名規則
- 25. モジュラーアプリケーションのデータベーステーブル命名規則
- 26. SQL命名規則のアドバイス
- 27. ローカルパラメータラベルの命名規則
- 28. プロパティの命名規則
- 29. Cの命名規則
- 30. cssメニューの命名規則
をすることができます、同じである必要がありますPythonでそれを見つけるsetup.py --help – YOU
@YO U:ありがとう、ビルド/ lib/tempディレクトリをオーバーライドすることができましたが、プラットフォームのサフィックスなどに関連するものは何も表示されません。 – hoefling
'python setup.py build --build-platlib ' – YOU