2017-06-04 64 views
0

我有一個Python包的源看起來像這樣在PyPI上開發python包時如何管理依賴關係?

├── MANIFEST.in 
├── README.rst 
├── setup.cfg 
├── setup.py 
└── sqlemon 
    ├── connection_strings.py 
    └── __init__.py 

大部分代碼是__init__.py,它具有以下的進口:

import os 
import sqlemon.connections_strings as sqlcs 
import yaml #This is the problem 

如果我們運行

python setup.py sdist 

我們看到以下錯誤

Traceback (most recent call last): 
    File "setup.py", line 2, in <module> 
    import sqlemon 
    File "/home/danielsank/src/sqlemon/sqlemon/__init__.py", line 4, in <module> 
    import yaml 
ImportError: No module named yaml 

這表明我工作在我的項目中的virtualenv必須安裝所有項目的依賴項才能進行開發。 我想這是沒有道理的,但我不能完全肯定的工作流程應該是什麼樣子,因爲該項目的依賴在setup.py列:在requirements.txt

from distutils.core import setup 
import sqlemon 

version = sqlemon.__version__ 
project_name = sqlemon.__project_name__ 

setup(name=project_name, 
     # Irrelevant lines removed 
     install_requires=[ 
      'sqlalchemy', 
      'alembic', 
      'pyyaml', 
      'sqlalchemy-schemadisplay' 
      ], 
) 

我通常把需求,以便開發人員可以做pip install -r requirements.txt,但因爲要求已經在setup.py中看起來多餘。

此外,在將我的項目上傳到PyPI後,當我嘗試從pypi進行pip安裝時,安裝失敗,除非我已經在我的virtualenv中安裝了pyyaml。顯然這不是我們想要的行爲; pyyaml應自動安裝,因爲它在setup.pyinstall_requires列表中列出。

這種情況下推薦的工作流程是什麼?

+0

它發生在我身上,一個選項可能是不導入我自己的包'setup.py' ... – DanielSank

+0

[相關](https://stackoverflow.com/questions/2058802/how-cani-i-獲得最版本定義功能於設置-PY-setuptools的 - 在 - 我的包) – DanielSank

回答

0

問題是,setup.py進口sqlemon其中進口pyyaml(原則上任何其他依賴項),所以不可能沒有安裝這些依賴項來處理它。 我有setup.py導入sqlemon的原因是爲了獲得版本號。 解釋版本號的更好策略here,它允許我們不導入我們自己的項目setup.py