2013-01-19 167 views
7

比方說,你有一個項目叫proj在這個項目中,你有以下結構:setup.py:重命名SRC包項目名稱

proj/ 
    dists/ 
    doc/ 
    src/ 
    __init__.py 
    xyz.py 
    abc.py 
    test/ 
    setup.py 

正如你可以看到所有的內容的項目是src子文件夾。如何從src文件夾中製作distutils分發包?

我天真的想法,以下the tutorial,會一直寫setup.py這樣的:

#omitting basics 
setup(
    name='proj', 
    packages=['src'], 
    package_dir={'proj':'src'} 
) 

但安裝所產生的包我的系統之後,我還是不得不進口src.xyz,而不是proj.xyz,這會是目標和預期的結果。

回答

-3

你可以嘗試添加src文件夾到PYTHONPATH調用setup函數之前:

import sys, os 
src_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'src') 
sys.path.append(src_path) 

而且也只是爲了安全起見,你再更改工作目錄:

os.chdir(src_path) 

之後,它應該都可以。

其他用於打包應用程序的工具支持從內部。我認爲這是setuptools,原來是PyInstaller。但基本上,這就是應該做的,就足以讓你的包直接導入。

結果distutils有package_dir指令。這就是你應該使用的,但它可能工作只需將您的包添加到PYTHONPATH

proj/ 
    src/ 
    proj/ 
     __init__.py 
     xyz.py 
     abc.py 
    setup.py 

和更改setup.py到:

# ... 
setup(
    name='proj', 
    packages=['proj'], 
    package_dir={'':'src'} 
) 

它不是由distutils的要求,但其他工具所期望的父目錄

+1

我不知道你得到了這個問題。我試圖編寫一個Python包,其他人可以輕鬆地自行安裝。這不僅僅是導入你在另一個文件夾中寫入的內容。 – erikbwork

+0

是的,我明白了,但是'setup.py'必須在另一個文件夾中導入內容才能工作。一旦這些軟件包在你的PYTHONPATH中,它們在哪裏並不重要。如果它不適合你,你將不得不看另一種方式,對不起。 – jadkik94

+0

對不起,但這不是問題。 – erikbwork

4

你可以通過把Python包文件到proj/目錄修復在這種情況下__init__.py文件的名稱與Python包名稱相同,即proj

+0

我做到了,它的工作原理。不知道我是否理解你最後的評論。你的意思是有些工具希望我有像proj/src/proj這樣的文件夾結構來按預期工作?似乎如此低效。或者我在這裏做的東西效率低下? – erikbwork

+0

我的意思是,目錄名:'/__初始化__ py'應該是一樣的Python包的名稱,即如果我看到'__init __ py'那麼只要看看它的父目錄的名字我知道Python包,它是。 – jfs

2

這是因爲在這裏報道setuptools的錯誤:https://github.com/pypa/setuptools/issues/250

基本上,它的工作,而不是在開發模式。現在,你有3個解決方案:

  • 符號鏈接src包作爲proj(和comitting時忽略它),它會開箱的,但髒
  • 變化從srcproj
  • 創建子目錄projsrc和使用以下選項:
 
packages=['proj'], 
package_dir={'proj': 'src/proj'}, 
+0

鏈接到setuptools問題:https://github.com/pypa/setuptools/issues/250 –

+0

問題已關閉3.5+ – Daniel