首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用setuptools包和同名的ext_modules?

如何使用setuptools包和同名的ext_modules?
EN

Stack Overflow用户
提问于 2019-05-21 19:00:40
回答 2查看 5.1K关注 0票数 3

我为我的Python扩展项目获得了以下文件结构:

代码语言:javascript
复制
.
├── setup.py
├── source
    ├── cppimplementation
    │   └── fastfile.cpp
    └── fastfilepackage
        ├── __init__.py
        └── version.py

我使用以下setup.py文件:

代码语言:javascript
复制
from setuptools import setup, Extension

setup(
        name= 'fastfilepackage',
        version= '0.1.1',
        package_dir = {
            '': 'source',
        },

        packages = [
            'fastfilepackage',
        ],

        ext_modules= [
            Extension(
                'fastfilepackage',
                [
                    'source/cppimplementation/fastfile.cpp',
                ]
            )
        ],
    )

我安装它们时:

代码语言:javascript
复制
$ pip3 --version
pip 19.1.1 (python 3.6)

$ python3 --version
Python 3.6.7

$ pip3 list
Package                Version      
---------------------- -------------
wheel                  0.33.1        
setuptools             40.8.0        
...

fastfilepackage$ pip3 install .

问题是,当我安装它时,我的Python扩展模块会被fastfilepackage/version.pyfastfilepackage/__init__.py覆盖,也就是说,在安装它之后,我得到了以下内容:

代码语言:javascript
复制
import fastfilepackage
print( dir( fastfilepackage ) )
# prints ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', 
#         '__name__', '__package__', '__path__', '__spec__', '__version__',
#         'version']

也就是说,没有由FastFile导出的source/cppimplementation/fastfile.cpp类,但是它有fastfilepackage/version.pyfastfilepackage/__init__.py文件。

这是已安装的文件结构:

代码语言:javascript
复制
.
└── dist-packages
    ├── fastfilepackage
    │   ├── __init__.py
    │   ├── __pycache__
    │   │   ├── __init__.cpython-36.pyc
    │   │   └── version.cpython-36.pyc
    │   └── version.py
    ├── fastfilepackage-0.1.1.dist-info
    │   ├── INSTALLER
    │   ├── LICENSE.txt
    │   ├── METADATA
    │   ├── RECORD
    │   ├── top_level.txt
    │   └── WHEEL
    └── fastfilepackage.cpython-36m-x86_64-linux-gnu.so

但是,如果我从安装文件中删除了package_dir = { '': 'source', },packages = [ 'fastfilepackage', ],行,那么我的Python扩展模块就正确安装了:

代码语言:javascript
复制
import fastfilepackage
print( dir( fastfilepackage ) )
# prints ['FastFile', '__doc__', '__file__', '__loader__', '__name__', 
#         '__package__', '__spec__']

也就是说,它有由FastFile导出的source/cppimplementation/fastfile.cpp类,但是它没有fastfilepackage/version.pyfastfilepackage/__init__.py文件。

这是已安装的文件结构:

代码语言:javascript
复制
.
└── dist-packages
    ├── fastfilepackage-0.1.1.dist-info
    │   ├── INSTALLER
    │   ├── LICENSE.txt
    │   ├── METADATA
    │   ├── RECORD
    │   ├── top_level.txt
    │   └── WHEEL
    └── fastfilepackage.cpython-36m-x86_64-linux-gnu.so

我怎样才能让ext_modulespackages在我的setup.py下使用相同的包名,而不需要一个覆盖另一个呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-21 19:17:32

你不能。第一次进口获胜。您不能有相同名称的脚本/模块/包/扩展-一个覆盖所有其他。

但你可以在另一个里面放一个。让您的扩展名为fastfilepackage.fastfilepackage,您可以import fastfilepackage导入Python包,import fastfilepackage.fastfilepackage导入扩展;或者from fastfilepackage import fastfilepackage

票数 2
EN

Stack Overflow用户

发布于 2019-05-21 22:30:04

作为最后的解决方案,我完全删除了所有Python *.py代码,因为它们导致C扩展代码慢了30%。现在我的setup.py变成了这样:

代码语言:javascript
复制
from setuptools import setup, Extension

setup(
        name = 'fastfilepackage',
        version = '0.1.1',

        ext_modules = [
            Extension(
                name = 'fastfilepackage',
                sources = [
                    'source/fastfile.cpp',
                ],
                include_dirs = ['source'],
            )
        ],
    )

档案结构:

代码语言:javascript
复制
.
├── setup.py
├── MANIFEST.in
├── README.md
├── LICENSE.txt
└── source
    ├── fastfile.cpp
    └── version.h

MANIFEST.in

代码语言:javascript
复制
include README.md
include LICENSE.txt

recursive-include source *.h

这是已安装的文件结构:(在任何地方都没有*.py文件= 100%的性能)

代码语言:javascript
复制
.
└── dist-packages
    ├── fastfilepackage-0.1.1.dist-info
    │   ├── INSTALLER
    │   ├── LICENSE.txt
    │   ├── METADATA
    │   ├── RECORD
    │   ├── top_level.txt
    │   └── WHEEL
    └── fastfilepackage.cpython-36m-x86_64-linux-gnu.so

我刚刚用一个C扩展模块属性直接替换了version.py

代码语言:javascript
复制
// https://docs.python.org/3/c-api/arg.html#c.Py_BuildValue
const char* __version__ = "0.1.1";
PyObject_SetAttrString( thismodule, "__version__", Py_BuildValue( "s", __version__ ) );

参考文献:

  1. 从C定义Python模块中的全局
  2. 原始提交:.py
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56244851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档