【发布时间】:2020-11-22 03:43:52
【问题描述】:
我希望使用 setuptools 将包部署到 PyPi。但是,包的核心部分实际上是用 Fortran 编写的,我使用 f2py 将其包装在 python 中。基本上项目的结构是这样的:
我的项目
- license.txt
- README.md
- setup.py
- 我的项目
- 初始化.py
- myfunc.py
- 你好.so
模块 myfunc.py 导入 hello.so (import my_project.hello),然后可以被 myfunc.py 中的函数使用。这在我的机器上完美运行。
然后我在我的 Ubuntu 上尝试了标准的 setuptools 安装:sudo python3 setup.py install,它安装得很好。但不幸的是,在导入时,它会抛出ModuleNotFoundError: No module named 'hello'。
现在,据我了解,在基于 Linux 的系统上,对于 python,共享库 *.so 存储在 /usr/lib/python3/dist-packages/ 中。所以我在那里手动复制了这个hello.so,我得到了一个工作包!但当然,这只适用于本地。我想做的是告诉 setuptools 在 python-egg 中包含hello.so 并自动进行复制等,这样当用户使用pip3 install my_package 时,他们将可以自动访问这个共享库。我可以看到 numpy 以某种方式实现了这一点,但即使在查看了他们的代码之后,我也无法解码他们是如何做到的。有人可以帮我弄这个吗?提前致谢。
【问题讨论】:
-
您是否对它只在 Linux 上运行感到高兴,还是它也必须在 Windows 和 Mac 上运行?它只能在(最常见的)x86_64 CPU 上工作还是必须在 i686 上工作?
-
@FiddleStix 如果它适用于 Windows 和 Mac,那就太好了,但我不坚持。另外,x86_64 就足够了。
-
为了确定,您想预编译 f2py 模块,这样用户自己就不需要 Fortran 工具链(但暗示所有与 Fortran 相关的依赖项都需要静态编译到 .so 中, (.dll 或 .dylib)由您提前为您打算支持的所有平台提供)?或者是否可以选择将 f2py 编译作为安装过程的一部分?
-
@jbdv 对我来说都可以。我很乐意编译和发布,但是那些 .so 应该会自动安装在用户机器上的适当位置。否则,用户编译、生成 .so 并将它们放置在可以由我的包导入的适当位置也很好。
-
我使用基于您评论的SO answer 的设置。这对你不起作用吗?对于本地安装 (
sudo python -m pip install .),它将 .so 文件放置在.../site-packages/my_project_f90.cpython-36m-x86_64-linux-gnu.so与其他项目文件相同的级别,例如.../site-packages/my_project-0.1-py3.6.egg-info。在创建车轮分布时会复制相同的结构,例如sudo python setup.py bdist_wheel在build/bdist.linux-x86_64/wheel。这对你来说是失败的吗?
标签: python-3.x fortran shared-libraries setuptools f2py