2014-07-23 66 views
2

我在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 sdistpip install networkit成功編譯庫,創建擴展並將其放置在pythonX/dist-packages/下。這是問題開始的地方:

  1. 我想將擴展名置於pythonX/dist-packages/networkit-x.y/之下。另外,_NetworKit.pyx不會自動包含,儘管它是擴展模塊的源代碼;我不得不通過MANIFEST.in包括它。
  2. 我試圖通過在上面的摘錄中添加packagespackage_dirsetup(...)來添加python模塊和子模塊。雖然sdist工作,幷包括所有.py文件,我通常在安裝過程中以directory ... not existing結束。此外,我嘗試調整存儲庫結構以及setup.py的位置以更符合官方建議。但是,這也沒有幫助。

另外總結一下究竟應該安裝在哪裏:Python模塊和子模塊以及擴展應該在pythonX/dist-packages/networkit-x.y/下。

除了可能不是很合適的目錄結構之外,我在setup(...)配置中丟失了什麼以獲取擴展以及Python模塊是否正確安裝?

回答

1

首先,你需要distutils setup()關鍵字package_dir={'':'src/python'}來指示你的python模塊的根文件夾,其次你可以使用setuptools函數find_packages(root_dir, include=[], exclude=[])找到你需要的包/模塊。所以你可能想要使用packages=find_packages('src/python')

請參閱setuptools文檔中的here以獲取更多信息。

Setuptools將始終將您的包安裝在../site-packages/<packagename>下。 dist-packages是系統軟件包管理員安裝的軟件包的debian版本;但是你的python也應該查看正確的site-packages文件夾。

如果您希望在開發時輕鬆安裝和卸載軟件包,我將分別使用pip install -e .pip uninstall -y networkit。有點管理安裝允許它也被卸載(所以你可以檢查一切正常,等)。

+0

正如你所說的,'dist-packages'只是debian,但是看起來我的系統上沒有'site-packages'。不過,謝謝你的提示,因爲在其他系統上嘗試時,這一點很有用。 – maxv