在 PyCharm 中寫 pip 包應該如何處理引用問題?

現在我想在 PyCharm 中開發一個 pip 包,整個 repo 的構架大概是這樣的:

repo
+-- module
+-- __init__
+-- __main__
+-- file_1.py
+-- file_2.py
+-- app.py
+-- app_gui.py
+-- setup.py
+-- readme

現在的問題在於如何處理 import。

PyCharm 好像對相對路徑處理並不是很友好(自動生成的都是絕對路徑的引用)。
而且 PyCharm 會把 repo 這個路徑加入到 PYTHONPATH 裡面。

我現在不知道最好的處理 import 的方法是什麼?

  1. 如果直接按 PyCharm 默認的來,把 repo 加入到 path 中,那麼我到時候上傳的 pip 上的 package 是不是出現 import error?(或者我需要在 __init__.py 中寫上把 repo 加入 PYTHONPATH 中?)
  2. 還是說我應該把 module 這個路徑加入 PYTHONPATH 中?
  3. 還是說我應該把 module 和 repo 都加入 PYTHONPATH 中?
  4. 或者我就累一點,把所有的絕對路徑 import 都變成相對路徑 import?

最好的方法是什麼樣的?請有經驗的人指教一下


就用絕對路徑是最好的,不要隨便用相對路徑,你的包如果有多個文件的話本身也應該是個package,那就是這樣的,比如說你的package想要叫my_super_project,那目錄結構就是:

my_super_project

+-- __init__.py

+-- my_super_module1.py

+-- my_dependency.py

+-- my_super_cli.py

tests

+-- __init__.py

+-- my_tests.py

resources

+-- ...

other_super_tools

+-- ...

setup.py

根目錄下一般放一個setup.py就好,所有要發布的都在my_super_project這個package裡面,如果有resource文件(比如HTML網頁之類)可以單獨放一個目錄,tests單獨放一個目錄,其他依賴放自己的目錄在發布的時候排除掉。命令行工具也是放在my_super_project/my_super_cli.py這樣的地方。setup.py裡面指定要發布的package是my_super_project。

所有的Python代碼import的時候都用

my_super_project.my_dependency

這樣的絕對路徑的方式引用,這個路徑在你的包安裝到site-packages里之後也不會變,在PyCharm裡面也不會變。在setup.py當中也同樣可以引用到。原理在於site-packages本身也是PYTHON_PATH的一部分,所以site-packages下面的目錄都可以被importer找到。

另一種發布方式是單模塊發布,用一個my_super_project.py文件取代上面的package,這樣發布出去之後這個文件會直接裝到site-packages裡面,成為一個獨立的模塊。這種情況下my_super_project.py跟setup.py放一個目錄里就行。不過考慮到將來代碼結構可能變複雜,建個package還是最好的,可以在__init__.py裡面將需要導出的對象都import進來,假裝自己是一個普通模塊。


推薦閱讀:

怎樣搭建基於 Python 的科學計算、數據處理環境?
請問python theano中的shared variable是指什麼意思?
Python 最重要的庫都有哪些?
python有木有類似cplusplus cppreference 這種網站?
Python 的庫函數里有沒有現成的全排列函數?

TAG:Python | PyCharm | Python庫 | 包管理器 | Python開發 |