我在NetworKit(https://networkit.iti.kit.edu/)上工作,這是一個混合的C++/Cython/Python項目。我想準備setup.py
腳本,以便可以通過pip install networkit
輕鬆安裝NetworKit。但是,有一些困難。無法指定擴展模塊的目的地,無法添加Python模塊
首先,讓我描述一下倉庫的目錄結構和setup.py目前的功能。
目錄結構:
NetworKit/
|- setup.py
|- README.rst
|- MANIFEST.in
|-src/
|-cpp/
| c++ header and source files in subfolders
|-python/
|- __init__.py
|- _NetworKit.pyx
| various python modules
python setup.py develop
目前確實三兩件事:
- 調用SCons的構建C++芯
- 建立的文件夾
src/python
在擴展模塊(這需要在C++芯) - 在pythonX/dist-packages /中鏈接到
src/python
。
下面是setup.py相關摘錄:
if ("install" in sys.argv) :
build_NetworKit()
src = ["_NetworKit.pyx"]
modules = [Extension("_NetworKit",
src,
language = "c++",
extra_compile_args=["-fopenmp", "-std=c++11", "-O3", "-DNOGTEST"],
extra_link_args=["-fopenmp", "-std=c++11"],
libraries=["NetworKit-Core-{0}".format(optimize)],
library_dirs=["../../"])]
for e in modules:
e.cython_directives = {"embedsignature" : True}
setup(name="networkit",
version="3.2",
url="https://networkit.iti.kit.edu/",
keywords = "graph algorithm network analysis social network",
cmdclass={"build_ext": build_ext},
ext_modules=modules)
我是怎麼到目前爲止實現: 隨着MANIFEST.in
我成功地包中包含的所有C++頭文件和源文件。來自PyPI的測試服務器的python setup.py sdist
和pip install networkit
成功編譯庫,創建擴展並將其放置在pythonX/dist-packages/
下。這是問題開始的地方:
- 我想將擴展名置於
pythonX/dist-packages/networkit-x.y/
之下。另外,_NetworKit.pyx不會自動包含,儘管它是擴展模塊的源代碼;我不得不通過MANIFEST.in
包括它。 - 我試圖通過在上面的摘錄中添加
packages
和package_dir
到setup(...)
來添加python模塊和子模塊。雖然sdist
工作,幷包括所有.py
文件,我通常在安裝過程中以directory ... not existing
結束。此外,我嘗試調整存儲庫結構以及setup.py
的位置以更符合官方建議。但是,這也沒有幫助。
另外總結一下究竟應該安裝在哪裏:Python模塊和子模塊以及擴展應該在pythonX/dist-packages/networkit-x.y/
下。
除了可能不是很合適的目錄結構之外,我在setup(...)
配置中丟失了什麼以獲取擴展以及Python模塊是否正確安裝?
正如你所說的,'dist-packages'只是debian,但是看起來我的系統上沒有'site-packages'。不過,謝謝你的提示,因爲在其他系統上嘗試時,這一點很有用。 – maxv