【发布时间】:2019-10-08 05:39:08
【问题描述】:
我的 Python C 扩展项目的文件结构如下:
.
├── setup.py
├── source
├── cppimplementation
│ └── fastfile.cpp
└── fastfilepackage
├── __init__.py
└── version.py
我使用以下setup.py 文件:
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',
]
)
],
)
我安装它们:
$ 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 C 扩展模块被 fastfilepackage/version.py 和 fastfilepackage/__init__.py 覆盖,即安装后,我得到以下信息:
import fastfilepackage
print( dir( fastfilepackage ) )
# prints ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__',
# '__name__', '__package__', '__path__', '__spec__', '__version__',
# 'version']
即,source/cppimplementation/fastfile.cpp 没有导出 FastFile 类,但它具有 fastfilepackage/version.py 和 fastfilepackage/__init__.py 文件。
这是安装的文件结构:
.
└── 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 C 扩展模块安装正确:
import fastfilepackage
print( dir( fastfilepackage ) )
# prints ['FastFile', '__doc__', '__file__', '__loader__', '__name__',
# '__package__', '__spec__']
即,它有source/cppimplementation/fastfile.cpp 导出的FastFile 类,但它没有fastfilepackage/version.py 和fastfilepackage/__init__.py 文件。
这是安装的文件结构:
.
└── 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_modules 和packages 放在我的setup.py 下使用相同的包名而不覆盖另一个?
【问题讨论】:
标签: python-3.x pip python-import setuptools python-c-api