

从Python环境搭建看新手踩坑启示录:那些年我们一起追的依赖。因为有一个老旧项目使用了python2,为了调试这个项目,我不得不安装早期版本的iPython。老旧项目的维护虽充满挑战,但科学的环境管理能显著降低时间成本。
近期在维护这个2015年的Python 2.7的科学计算模型项目时,需要复现基于IPython 5.8的交互式分析环境。由于项目依赖古老的科学计算库(如NumPy 1.12、Pandas 0.20),直接升级至Python 3会导致核心算法报错。本文记录从环境搭建到依赖调优的全流程,重点解决以下技术矛盾:
iPython 是 Python 生态系统中一个几乎“必不可少”的工具,尤其对于数据科学、研究和教育领域。
简单来说,iPython 是一个增强版的、交互式的 Python 命令行 shell。
它保留了标准 Python shell 的所有功能,但在此基础上增加了大量令人惊叹的特性,让编写、测试和调试代码变得异常高效和愉快。IPython是一个交互式计算系统。主要包含三个组件:增加的交互式 “Python shell”,解耦的双过程通信模型,交互式并行计算的架构。支持变量自动补全。
本来以为是很轻松就能解决的问题,没想到还是遇到不少bug,让我颇费了一番功夫才解决问题。特记录如下:
Traceback (most recent call last): File "C:\Python27\Scripts\ipython-script.py", line 5, in <module> from pkg_resources import load_entry_point File "C:\Python27\lib\site-packages\distribute-0.6.35-py2.7.egg\pkg_resources.py", line 2809, in <module> parse_requirements(__requires__), Environment() File "C:\Python27\lib\site-packages\distribute-0.6.35-py2.7.egg\pkg_resources.py", line 594, in resolve raise DistributionNotFound(req)pkg_resources.DistributionNotFound: pyreadline>=1.7.1 |
|---|
这是安装第四步,没有使用管理员权限执行;以及没有先安装pyreadline的缘故。
Error in sys.excepthook:Traceback (most recent call last): File "C:\Python27\lib\site-packages\IPython\frontend\qt\console\qtconsoleapp.py", line 51, in gui_excepthook old_excepthook(exctype, value, tb)TypeError: 'NoneType' object is not callableOriginal exception was:Traceback (most recent call last): File "C:\Python27\Scripts\ipython-script.py", line 9, in <module> load_entry_point('ipython==0.13.1', 'console_scripts', 'ipython')() File "C:\Python27\lib\site-packages\IPython\frontend\terminal\ipapp.py", line388, in launch_new_instance app.initialize() File "<string>", line 2, in initialize File "C:\Python27\lib\site-packages\IPython\config\application.py", line 84, in catch_config_error return method(app, *args, **kwargs) File "C:\Python27\lib\site-packages\IPython\frontend\terminal\ipapp.py", line313, in initialize super(TerminalIPythonApp, self).initialize(argv) File "<string>", line 2, in initialize File "C:\Python27\lib\site-packages\IPython\config\application.py", line 84, in catch_config_error return method(app, *args, **kwargs) File "C:\Python27\lib\site-packages\IPython\core\application.py", line 325, in initialize self.parse_command_line(argv) File "C:\Python27\lib\site-packages\IPython\frontend\terminal\ipapp.py", line308, in parse_command_line return super(TerminalIPythonApp, self).parse_command_line(argv) File "<string>", line 2, in parse_command_line File "C:\Python27\lib\site-packages\IPython\config\application.py", line 84, in catch_config_error return method(app, *args, **kwargs) File "C:\Python27\lib\site-packages\IPython\config\application.py", line 420,in parse_command_line return self.initialize_subcommand(subc, subargv) File "<string>", line 2, in initialize_subcommand File "C:\Python27\lib\site-packages\IPython\config\application.py", line 84, in catch_config_error return method(app, *args, **kwargs) File "C:\Python27\lib\site-packages\IPython\config\application.py", line 352,in initialize_subcommand subapp = import_item(subapp) File "C:\Python27\lib\site-packages\IPython\utils\importstring.py", line 40, in import_item module = __import__(package,fromlist=[obj]) File "C:\Python27\lib\site-packages\IPython\frontend\qt\console\qtconsoleapp.py", line 56, in <module> from IPython.external.qt import QtCore, QtGui File "C:\Python27\lib\site-packages\IPython\external\qt.py", line 43, in <module> raise ImportError('Cannot import PySide >= 1.0.3 or PyQt4 >= 4.7')ImportError: Cannot import PySide >= 1.0.3 or PyQt4 >= 4.7 |
|---|
最后再安装PyQt即可:pip install pyqt

还是报错,这个错误非常常见。pip告诉你它找不到名为pyqt的包。这并不是网络或镜像源的问题,而是包名不正确。看来需要使用正确的包名。
PyQt5并不是一个纯Python的包,它包含C++代码,因此需要编译。通常,我们会从预编译的wheel文件安装,这样就不需要本地编译环境。如果系统没有对应的预编译wheel,pip会尝试从源码编译,这就需要安装Qt SDK和相应的编译工具,过程较为复杂。
为了加速,使用国内的镜像源。

由于 PyQt5 是一个包含二进制扩展(C++代码)的包,pip 需要下载与你的 Python 版本、操作系统(Windows/Linux/macOS)和 系统位数(32位/64位)完全匹配的“预编译轮子文件”(wheel)。
如果阿里云镜像暂时没有与你环境完全匹配的最新版本的轮子,pip 会尝试从源代码编译,这个过程非常复杂,需要安装 Visual Studio(Windows)或 GCC(Linux/macOS)等编译环境,极易失败。
解决方案:使用 Unofficial Windows Binaries 预编译包
对于 Windows 用户,一个非常可靠的方法是使用 Christoph Gohlke 提供的 unofficial Windows binaries。他的网站为几乎所有科学计算和图形领域的 Python 包提供了预编译好的 Windows 版本。
PyQt5‑5.15.7‑cp310‑cp310‑win_amd64.whlcp310 表示 Python 3.10win_amd64 表示 64 位 Windowswin32 表示 32 位 Windows3. 使用 pip 安装下载好的文件:
打开命令行,cd 到你下载的 .whl 文件所在的目录,然后运行:
pip install PyQt5‑5.15.7‑cp310‑cp310‑win_amd64.whl
# 请将文件名替换为你实际下载的文件名这种方法几乎可以保证 100% 成功。
# 创建无系统依赖的纯净环境
virtualenv -p /usr/bin/python2.7 --no-site-packages py2env
source py2env/bin/activate
# 验证Python版本(必须为2.7.18)
python --version踩坑点:系统默认Python可能指向3.x,需通过which python确认路径
使用pip-compile生成确定性依赖清单(requirements.txt)
# requirements.in
ipython==5.8.0
pyzmq==19.0.2
jupyter_client==5.3.1
prompt_toolkit==1.0.15
numpy==1.12.1
pandas==0.20.3安装依赖:
pip install -r requirements.txt项目如果再复杂一点,更可以也应该考虑容器化方案:Dockerfile示例
FROM python:2.7.18-slim
RUN apt-get update && apt-get install -y gcc libzmq3-dev
COPY requirements.txt .
RUN pip install -r requirements.txt
CMD ["ipython"]对于必须维护的Python 2项目,建议采用容器化隔离+自动化依赖管理的组合方案,将环境配置时间从数小时压缩至分钟级。
标准 Python Shell:
>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> a. # 在这里按Tab,什么也不会发生
>>> # 你想看看a有哪些方法,只能去查文档
>>> print? # 报错 SyntaxError: invalid syntaxiPython Shell:
In [1]: import numpy as np
In [2]: a = np.array([1, 2, 3])
In [3]: a. # 按Tab键,会弹出所有方法:a.cumsum, a.max, a.shape, a.T等等。
In [4]: np.max? # 立即显示np.max函数的帮助文档
In [5]: %timeit a.max() # 测试a.max()的执行速度
2.47 µs ± 86.7 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
In [6]: ls # 查看当前目录下的文件
README.md data.csv my_script.py
In [7]: %run my_script.py # 运行外部脚本
Hello from my script!==指定库版本,避免自动升级。libzmq),再安装Python包。pip install -v的详细日志定位问题。总而言之,iPython 不是一个必需品,但它是一个巨大的“生产力加速器”。一旦习惯它的高效和便捷,你很难再回到那个“简陋”的标准 Python Shell。对于任何经常使用 Python 进行交互式编程的人来说,它绝对值得一试。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。