setuptools
не может сделать это так, как вы хотите: он будет искать py_modules
только там, где setup.py
. Самый простой способ IMHO - сохранить модули SWIG там, где вы хотите, в структуре пространства имен / каталогов: переименуйте src
в hello
и добавьте hello/__init__.py
(может быть пустым или просто включать все, начиная с hello.hello
), оставляя вас с этим деревом:
$ tree .
.
├── hello
│ ├── __init__.py
│ ├── _hello.cpython-37m-darwin.so
│ ├── hello.c
│ ├── hello.h
│ ├── hello.i
│ ├── hello.py
│ └── hello_wrap.c
└── setup.py
Удалить py_modules
из setup.py
. "hello"
в списке package
заставит setuptools
забрать весь пакет, включая __init__.py
и сгенерированный hello.py
:
import os
import sys
from setuptools import setup, find_packages, Extension
from setuptools.command.build_py import build_py as _build_py
class build_py(_build_py):
def run(self):
self.run_command("build_ext")
return super().run()
setup(
name='hello_world',
version='0.1',
cmdclass={'build_py': build_py},
packages = ["hello"],
ext_modules=[
Extension(
'hello._hello',
[
'hello/hello.i',
'hello/hello.c'
],
include_dirs=[
"hello",
],
depends=[
'hello/hello.h'
],
)
],
)
Таким образом, также .egg-link
пакет работает (python setup.py develop
), так что вы можете связать разрабатываемый пакет в venv или около того. Это также является причиной того, как работает setuptools
(и distutils
): песочница для разработчиков должна быть структурирована таким образом, чтобы можно было запускать код непосредственно из нее, не перемещая модули.
Сгенерированный SWIG hello.py
и сгенерированное расширение _hello
будут жить в hello
:
>>> from hello import hello, _hello
>>> print(hello)
<module 'hello.hello' from '~/so56562132/hello/hello.py'>
>>> print(_hello)
<module 'hello._hello' from '~/so56562132/hello/_hello.cpython-37m-darwin.so'>
(как вы можете видеть из расширения имени файла, я сейчас нахожусь на Mac, но в Windows это работает точно так же)
Кроме того, помимо руководства, в руководстве SWIG есть более полезная информация о пространствах имен и пакетах SWIG и Python: http://swig.org/Doc4.0/Python.html#Python_nn72