我正在开发一个软件包,在我的工作中requirements.txt,我有一个依赖:wikipedia.现在,wikipedia1.3使用requests-2.2.1我的包使用版本2.3.0.
此外,正如人们所预料的那样,wikipedia-1.3安装取决于它的依赖性.
但是,如果我开始一个新的virtualenv和直接包括wikipedia在我的requirements.txt,它提供了一个ImportError上requests,因为当时的setup.py运行,requests-2.3.0的setup.py不执行,除非所有其他执行.在下面附的图,有没有运行setup.py了requests它就会被解开了.

出于某种奇怪的原因,wikipedia的setup.py包含import wikipedia,这反过来进口它的依赖他们甚至在安装之前; 然而,它通过了CI测试,因为它通过pip单独安装需求然后运行setup.py.
为了解决这个问题,我制作了一个包含以下内容的安装脚本:
pip install -r requirements.txt
pip install wikipedia
pip install -e .
Run Code Online (Sandbox Code Playgroud)
requests-2.3.0和beautifulsoup4;wikipedia(其然后可以运行setup.py并安装wikipedia和requests-2.2.1)requests-2.3.0再次安装我的包.因此requests-2.3.0首先安装,然后由旧版本2.2.1替换,然后再次替换2.3.0. …
对于python的wikipedia模块(通过pip安装)
当我使用ipython并执行以下操作时:
import wikipedia
print wikipedia.summary("Wikipedia")
Run Code Online (Sandbox Code Playgroud)
..工作正常.但是当我在文件中保存它并从shell运行它时:
python filename.py
Run Code Online (Sandbox Code Playgroud)
它显示了AttributeError:'module'对象没有属性'summary'
为什么会这样?
PS:我后来在'filename.py'中包含以下内容,列出了这个模块的范围:
print dir(wikipedia)
Run Code Online (Sandbox Code Playgroud)
..这给了:
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'wikipedia']
Run Code Online (Sandbox Code Playgroud)
而在ipython中,dir(维基百科)按预期提供所有名称:
['API_URL', ..(snip) .. 'PageError', 'RATE_LIMIT', .. (snip) .. '__name__', 'time', 'timedelta']
Run Code Online (Sandbox Code Playgroud)
为什么这样?