2017-03-06 29 views
2

我正在使用Python來開發少數公司特定的應用程序。有一個定製的共享模塊(「庫」),它描述了一些數據和算法,並且有數十個Python腳本可以與這個庫一起工作。有相當多的這些文件,所以他們在子文件夾如何使用依賴包括我自己的自定義庫來維護python應用程序?

myproject 
    apps 
     main_apps 
      app1.py 
      app2.py 
      ... 
     utils 
      util1.py 
      util2.py 
      ... 
    library 
     __init__.py 
     submodule1 
      __init__.py 
      file1.py 
      ... 
     submodule2 
      ... 

用戶希望通過簡單地去,說要運行這些腳本組織,以MYPROJECT \ utils的並推出「PY util2.py some_params」。其中許多用戶都是開發人員,因此他們經常想要編輯庫並立即使用更新後的代碼重新運行腳本。這個項目也有一些第三方庫,我想確保每個人都使用這些庫的相同版本。

現在,有我遇到了兩個關鍵問題:

  1. 如何引用自(應用程序)(庫)?
  2. 如何管理第三方依賴關係?

許多Python開發人員都很熟悉第一個問題,並曾多次被問到:要指示Python從「.... \ library」導入包是相當困難的。我測試了幾種不同的方法,但似乎python不願在任何地方搜索包,而是在標準庫位置或腳本本身的文件夾中搜索包。

  • 相對導入不起作用,因爲腳本不是庫的一部分(即使是這樣,當腳本直接執行除非它被放置在「根」項目文件夾中,這仍然不起作用倒要避免)
  • 讀取this document)腳本文件夾放置.pth文件(如人們想象的顯然不會有任何影響

當然有工作的sys.path直接干預,但樣板代碼像這樣的在每個和腳本文件的每一個看起來相當可怕

import sys, os.path 
here = os.path.dirname(os.path.realpath(__file__)) 
module_root = os.path.abspath(os.path.join(here, '../..')) 
sys.path.append(python_root) 
import my_library 

我意識到,這是因爲Python的希望我的圖書館被正確「安裝」,這就是確實是唯一正確的方式去了這個庫是從使用它的腳本單獨開發。但不幸的是,情況並非如此,我認爲每次更改庫時重新進行「安裝」將會非常不方便,並且容易出錯。

第二個問題很簡單。有人在我們的應用程序/ lib中添加了新的第三方模塊,並且所有人在更新應用程序後都會看到導入問題。開發的幾個分支,不同的時刻,當用戶做點安裝,很少回滾 - 每個人最終都會使用不同版本的第三方模塊結束。在我的情況下,事情還的事實,許多開發者工作了很多與老的Python 2.x的代碼複雜,而我想上移動到Python 3.x的

儘管找我的問題可能的解決方案,我在Python中發現了一個非常出色的虛擬環境功能。事情看起來很亮:

  1. 爲MyProject的創建VENV
  2. 分發程序的要求。txt文件作爲應用程序的一部分,並提供填充VENV相應
  3. 符號鏈接自己的庫VENV site_packages文件夾,所以它會被Python

總是被檢測到該解決方案看起來很自然&強大的腳本。我明確地爲自己的項目設置了自己的環境,並將我需要的任何東西放置到該Venv中,包括我自己的lib,我仍然可以即時編輯。它確實有效。但調用 activate.bat使這個python環境處於活動狀態,另一個批處理文件停用它是一團糟,特別是在Windows平臺上。正在編輯sys.path的樣板代碼看起來很糟糕,但至少它不會像這個潛在的修補程序那樣干擾UX。

所以有一個問題,我想問。

  1. 有沒有辦法將特定的python venv綁定到特定的文件夾,所以python啓動器會自動將這個venv用於這些文件夾中的腳本?
  2. 有沒有更好的替代方法來處理我錯過的這種情況?

環境爲我的項目是Python的3.6在Windows 10上運行

+0

你使用'setuptools.py'來「安裝」嗎?如果是這樣,你可以使用'develop'命令行參數而不是'install',參見討論[這裏](http://stackoverflow.com/questions/19048732/python-setup-py-develop-vs-install) 。這使您可以在庫上工作,並立即查看您所做的更改。 –

+0

不幸的是,據我所知,那些對你有用的工具在Windows上並不是真的可用。例如,你可能試着尋找相當於['autoenv'](https://github.com/kennethreitz/autoenv) –

+0

謝謝!這是我完全錯過的一個很好的選擇。現在在我的項目中沒有「安裝」過程,只需通過修改的sys.path查找模塊即可。我更喜歡使用PIP而不是setuptools.py,但它有一個類似的選項('pip install -e'),這是使用我的自定義庫與符號鏈接選項初始化環境(虛擬或非虛擬)的好方法。這樣,在很多情況下,在沒有任何虛擬環境的情況下也可能會生活(儘管我更喜歡保留一個以便更容易地控制依賴關係) –

回答

1

我想我終於找到了一個合理的答案。只需在venv中添加指向python解釋器的shebang行即可,例如

#!../../venv/Scripts/python 

整個項目結構看起來像這樣

myproject 
    apps 
     main_apps 
      app1.py (with shebang) 
      app2.py (with shebang) 
      ... 
     utils 
      util1.py (with shebang) 
      util2.py (with shebang) 
      ... 
    library 
     __init__.py 
     submodule1 
      __init__.py 
      file1.py 
      ... 
     submodule2 
      ... 
    venv 
     (python interpreter, 3rd party modules) 
     (symlink to library) 
    requirements.txt 
    init_environment.bat 

和工作的事情是這樣的:

  1. VENV是一切虛擬的Python環境項目需要
  2. init_environment.bat是一個根據requirements.txt填充venv的腳本,並將一個符號鏈接放到我的庫中,並放入venv站點模塊
  3. 所有的腳本與shebang行指向(使用相對路徑)開始VENV解釋

有一個與所有的庫,包括我自己,並使用它都將有很自然的進口腳本,完全自定義的環境。當我的項目中的任何面向用戶的腳本從控制檯或Windows資源管理器啓動時,Python啓動器也將自動選擇Python 3.6作爲解釋器&加載相關模塊。

缺點:

  1. 如果腳本是從其他文件夾,名爲
  2. 用戶仍然必須手動運行init_environment.bat更新根據虛擬環境requirements.txt
  3. 相對家當將無法正常工作
  4. 在Windows init_environment紙條需要提升權限,使一個符號鏈接(但希望那個奇怪的MS決定將固定在April'17即將到來的Win10更新)

但是我可以忍受這些限制。希望這會幫助其他人尋找類似的問題。

如果還能聽到其他選項(如答案)和評論者(如評論),仍然不錯。

相關問題