资讯动态

PharmaPy 干法制粒二次开发教程(2):环境搭建——在 Python 3.9 + conda 上从源码安装 CryPTSys/PharmaPy

发布时间:2026/10/17 19:18:26 来源:尧图企业网站定制
PharmaPy 干法制粒二次开发教程2环境搭建——在 Python 3.9 conda 上从源码安装 CryPTSys/PharmaPy版本声明块工具/软件CryPTSys/PharmaPy v.1.0.0 (GitHub Release) / setup.py 标 0.0.1语言/环境Python 3.9 conda-forgenumpy2 / scipy1.14 / assimulo3.4.3 / cython3本文目标搭好一个能导入 PharmaPy 并跑通官方测试的可复现环境作为后续所有二次开发工作的地基。一句话结论PharmaPy 不能在 PyPI 安装没有pip install pharmapy官方指定 Python 3.9 conda-forge 的assimulo3.4.3必须从 GitHub 源码python setup.py develop安装并用cd tests python reactor_tests.py验证通过——本文给出 Windows/macOS 两套完整命令和三处与底账版本声明0.0.1 vs v1.0.0相关的坑。〇、本篇要解决的认知问题为什么 PharmaPy 不能pip install pharmapy非要用 conda 从源码装运维上最麻烦的assimulo到底是个什么库为什么它只能从 conda-forge 装为什么官方指定 Python 3.9还锁定numpy2、scipy1.14、cython3python setup.py develop与install有什么区别二次开发为什么要用 develop装完怎么确认真的装好了而不仅仅是import 不报错一、机制解析1.1 为什么必须 conda 从源码assimulo 被封在 conda-forge底账 A2 写得很清楚PharmaPy不发布 PyPI官方安装指引的原话是For PharmaPy installation, you must use the source codeREAD.ME 也写了download and unzip the code from the release section, then follow the instructions on the install_instructions.txt file。那为什么偏偏绕不开 conda关键是assimulo。assimulo 是丹麦技术大学DTU团队维护的 ODE/DAE 高阶求解器封装库它的底层绑定的是SUNDIALS美国 LLNL 国家实验室的数值积分器套件内含 CVODE、IDA 等。assimulo3.4.3的构建靠预编译的共享库如sundials*.dll/.so链接而这类带原生二进制 BLAS/LAPACK 依赖的包很难在 PyPI 上保证全平台可用所以它的官方渠道就是 conda-forge。这就解释了整条链路conda install -c conda-forge assimulo3.4.3会用 conda 的编译器 ABI 和 SUNDIALS 二进制和 PharmaPy 内 Cython 编译出来的扩展在同一套工具链下避免 .dll 冲突。换句话说不是想用 conda而是 assimulo 逼你上 conda。版本锚点本系列所有环境与代码一律按Python 3.9、assimulo3.4.3、scipy1.14、numpy2、cython3对齐实施计划铁律第 1 条。这个组合写一次后续 20 篇不再改动。1.2 版本为什么锁这么死numpy/scipy/cython 的上限requirements.txt 逐字就只有六行numpy2 cython3 scipy1.14 assimulo3.4.3 matplotlib pandasnumpy2numpy 2.x 在 2024 年发布改动大量 C-API 与默认uint语义PharmaPy 内 Cython 编译的扩展、以及 assimulo 的绑带编译产物若按 1.x 的 C-ABI 编出来在 2.x 下运行会直接段错误或undefined symbol。所以把 numpy 锁在 1.x2。scipy1.14PharmaPy 大量使用 scipy 的integrate、interpolate内部函数与私有接口scipy 1.14 调整了些签名/移除了部分 deprecated 接口会导致旧代码 ImportError。cython3若环境里忘记 cythonsetup.py develop就没法现场把.pyx编译成.c但 cython 3 现在默认language_level变了、旧语法警告变多官方直接锁到 3 以下少惹麻烦。assimulo3.4.3精确等号锁定因为这个版本对应的 SUNDIALS 绑带与 PharmaPy 的用法验证过upgrade 到 3.5 可能接口变化降级则装不到 conda-forge。1.3setup.py develop之于二次开发的意义从源码安装时install_instructions.txt 用的是python setup.py develop而不是python setup.py install。develop等价于新版 pip 的pip install -e .的作用是把源码目录以可编辑链接方式挂进 site-packages你的包代码不复制、不打包直接在被引用时加载PharmaPy/目录里的文件。这对本系列至关重要后续每一篇你都会往PharmaPy/里加新的.py单元类RollerCompactor、Mill、Classifier……。用develop装上后你改了源码立刻生效无需每次重新setup.py develop。如果用install改代码要重装开发体验极差。1.4 一处必须知道的版本不一致0.0.1 vs v1.0.0底账 A2 记录了一个事实setup.py里写的是version0.0.1而 GitHub Release 标题是v1.0.0 “Initial Release”。两处对不上。这并不影响安装setup.py develop不依赖版本号做分发但会让你在pharmapy.__version__或 pip 元数据里看到 0.0.1 而困惑。确认版本以GitHub Release v1.0.0为准setup.py 里的 0.0.1 是上游遗留的占位版本号。1.5 为什么独立建环境而不是直接用系统 Python很多工程师习惯装到全局环境图省事但仿真二次开发强烈建议每个项目独立 conda 环境。原因有二其一本系列的版本配方Python 3.9 numpy2 scipy1.14 assimulo3.4.3是全局环境很难长期满足的——你机器上其他脚本很可能已把 numpy 升到 2.x、scipy 升到 1.14全局环境一装就冲突其二二次开发会频繁setup.py develop并写入 site-packages如果放任全局环境改坏了一个项目的源码会污染你所有用到该解释器的脚本。独立pharmapy环境断了这条路也让装坏了重来变成一条命令的事删环境重建即可。这也是官方 install_instructions.txt 一上来就用conda create --name的原因。二、完整代码与逐行剖析下面的命令块严格按官方install_instructions.txt的步骤展开建环境 → 装依赖 → 源码安装 → 验证并补上 Windows / macOS 两套。所有蓝色锚点数字为版本声明块中的固定值请勿改动。2.1 Windows 完整流程:: Step 1: 用 conda 建一个 Python 3.9 环境 conda create --name pharmapy python3.9 -y :: ^-- 官方指定 python3.9install_instructions.txt :: pharmapy 是自定义环境名可换成 env_name :: Step 2: 激活环境 conda activate pharmapy :: Step 3: 按仓库 requirements.txt 装锁定依赖 :: 先进入 PharmaPy 源码根目录解压后 or git clone 后 cd PharmaPy conda install -c conda-forge --file requirements.txt -y :: ^-- 关键assimulo3.4.3 / numpy2 / scipy1.14 / cython3 一并装 :: -c conda-forge 是 assimulo 的官方渠道 :: Step 4: 从源码以 develop 模式安装无 PyPI python setup.py develop :: 本仓库没有 .egg/.whl 走这一步develop 让后续改码即改即用 :: Step 5: 验证 cd tests python reactor_tests.py :: 应无 ERROR退出码 0拿到源码有两种方式任选其一git clone https://github.com/CryPTSys/PharmaPy.git :: 或GitHub Release 页下载 v1.0.0 源码 zip 并解压2.2 macOS 完整流程官方还配了一键脚本InstallOnMac.shWindows 是InstallOnWindows.bat也会把上面四步串起来。手写版与之等效# Step 1-2: 建环境 激活 conda create--namepharmapypython3.9-yconda activate pharmapy# Step 3: 依赖 cdPharmaPy condainstall-cconda-forge--filerequirements.txt-y# Step 4: 源码 develop 安装 python setup.py develop# Step 5: 验证 cdtestspython reactor_tests.py一键脚本仓库根目录的InstallOnMac.sh/InstallOnWindows.bat内部就是上面命令的封装。如果你信任脚本且环境干净直接双击.batWindows或bash InstallOnMac.shmacOS即可脚本报错定位时回来逐条手工执行更可控。2.3 一条先试 import的探针装完后用一条命令确认神经通路接通也可以放到你的hello_pharmapy.py里importpharmapy# 顶层包从 site-packages 加载源码目录fromPharmaPy.ReactorsimportBatchReactor# 类 import 成功即 compile 通过importnumpy,scipy,assimuloprint(numpy,numpy.__version__)# 应 2.0print(scipy,scipy.__version__)# 应 1.14print(assimulo,assimulo.__version__)# 应 3.4.3print(OK: PharmaPy env ready)能打出 “OK: PharmaPy env ready” 且三者版本落在锚点区间内说明依赖与扩展全部编译链接成功——这是比单纯import更强的版本一致性验证对应铁律第 1 条。2.4 一张图先认清我们要仿真的目标在动手之前先认清本系列 20 篇要一起攻克的仿真目标——干法制粒全流程拓扑见 fig01。官方 PharmaPy只覆盖原料药侧drug substance单元而干法制粒三件套辊压 → 粉碎整粒 → 分级在框架里是空白这正是本系列从零二次开发的价值所在。环境搭好后下一篇就会进入 PharmaPy 的对象模型与 flowsheet 机制届时这张拓扑会成为我们逐个填入自定义单元的地图。三、常见报错与排查以下坑按底账 A2 个人工程经验归类现象→根因→解法三段式可当排查手册用。坑 1conda install assimulo什么都没装 / 报 Channels 找不到现象assimulo未出现在环境中或提示 “No package found”。根因assimulo只发布在 conda-forge默认的 defaults 通道没有它装了也要确认确实是 conda-forge 的版本。解法一定要带-c conda-forge本教程命令已带若还不行可conda config --add channels conda-forge把 conda-forge 设为首选通道再重装。坑 2scipy 版本过高导致的 ImportError现象import PharmaPy 或python reactor_tests.py时报ImportError: cannot import name ... from scipy。根因底账要求scipy1.14若 conda 解到了 1.14PharmaPy 用到的scipy内部接口如scipy.integrate、scipy.special、interp1d的某些写法被移除或改签名。解法conda install -c conda-forge scipy1.14回退版本重跑测试。坑 3numpy 2.x 下的段错误 / undefined symbol现象import pharmapy直接崩Segmentation fault或加载扩展时报undefined symbol。根因numpy2 上限没锁住装了 numpy 2.xPharmaPy/assimulo 的 Cython 扩展按 1.x ABI 编译run 在 2.x 二进制上不兼容。解法conda install -c conda-forge numpy2并保证与setup.py develop编译用同一环境先锁 numpy 再 develop。坑 4setup.py version 显示 0.0.1 而非 v1.0.0现象pharmapy.__version__或包元数据显示 0.0.1和你从 Release 拿到的 v1.0.0 对不上。根因这是上游事实底账 A2setup.py里version0.0.1是遗留占位而 GitHub Release 标题是 v1.0.0 “Initial Release”两处不一致。解法别改也别慌。develop 安装不依赖版本号做分发确认代码与 README 是否为 Release v1.0.0 内容即可版本声明以GitHub Release v1.0.0为准。若你在发布流程里需要语义版本再自行在 setup.py 打补丁。坑 5Windows 下setup.py develop报没有 C 编译器 / Cython 报错现象error 提到Microsoft Visual C ... required或Unable to find vcvarsall.bat或 cython 报语法。根因PharmaPy 含.pyxCython 源develop时需现场编译 C 扩展Windows 上缺 MSVC 编译工具链或 cython 版本 3底账要求 ❤️。解法先conda install -c conda-forge cython3requirements.txt 已锁定仍不行则安装Microsoft C Build Tools并勾选VC 工具集 Windows SDKconda-forge 的lang.compilevs 编译器需与 MSVC 一致最简单是改用 conda-forge 自带编译器的 Linux/容器里编译。坑 6Python 版本过新3.10/3.11/3.12/3.13现象assimulo 装不上预编译版、或 PharmaPy 某些语法在新解释器爆 warning/error。根因官方 install_instructions.txt指定 Python 3.9后续解释器对旧包的可执行二进制与 API 不保证兼容。解法用 3.9 重建环境conda create --name pharmapy python3.9别再迁就默认解释器。坑 7git clone拉到别的分支 / 用了本地缓存旧源码现象装的代码与 Release v1.0.0 行为不一致或setup.py develop编译的是别人改动过的版本。根因直接git clone默认拉 master/developdevelop 是活跃开发分支可能尚未随 Release 发布或系统里有同名旧目录被复用。解法确保拿到的是v1.0.0 Initial Releasegit clone ... cd PharmaPy git checkout v1.0.0或 git tag 看可用 tag或直接下载 Release 页源码 zip 并全新解压到一个干净目录再走 2.1/2.2 的手工流程。四、动手练习练习 1环境探针入门创建hello_pharmapy.py内容即第 2.3 节那段探针脚本跑python hello_pharmapy.py。判定标准输出 “OK: PharmaPy env ready”且numpy.__version__ 2.0、scipy.__version__ 1.14、assimulo.__version__ 3.4.3三者全部通过。练习 2跑官方测试验证安装在源码tests/目录执行python reactor_tests.py。判定标准脚本完整跑完、不含任何 ERROR、进程退出码 0echo $LASTEXITCODEPowerShell或echo $?bash打 0。练习 3develop 即时生效验证为二次开发铺路在PharmaPy/里某模块如PharmaPy/Commons.py末尾临时加一句print(dev-hook-loaded)重新打开解释器再执行import pharmapy。判定标准无需重新setup.py developimport 时立即看到dev-hook-loaded打印——证明开发时可编辑加载本文采用develop而非install的意义所在。验证完删掉那句。以上三个练习全由可复现命令 明确判定支撑满足实施计划中每步给验证标准的要求。环境核对清单收尾自检①conda env list能看到pharmapy②conda activate pharmapy后python -V显示 3.9.x③conda list里 assimulo 版本为 3.4.3、numpy2、scipy1.14④python reactor_tests.py无 ERROR 退出码 0⑤import pharmapy成功。五项全过环境就绪可以放心进入下一篇对象模型与 flowsheet 机制。五、小结与下一篇预告本篇解决了怎么把 PharmaPy 跑起来用 conda 建 Python 3.9 环境conda install -c conda-forge --file requirements.txt锁定 assimulo3.4.3 / numpy2 / scipy1.14 / cython3再python setup.py develop从 GitHub 源码安装无 PyPI最后用tests/reactor_tests.py验证。我们同时看清了机制assimulo 靠 conda-forge 才能拿到版本锁得像一个配方是为了和 PharmaPy/assimulo 的编译 ABI 对齐develop则让后续每篇新增的单元类做到改码即用。下一篇预告PharmaPy 的对象模型与 flowsheet 机制篇 03。装好之后我们要理解 PharmaPy 是怎么串流程的SimulationExec执行器、R01 -- HOLD01 -- CR01 -- F01拓扑字符串、如何把Utility/Kinetics/Inlet/Phases挂到单元上、SolveFlowsheet怎么求解以及怎么从DynamicResult.time和结果字段里取数。届时我们用官方 guide 的 R01→HOLD01→CR01→F01 案例跑通整条链路这套挂载—解析—求解—取数的心智模型就是后续把辊压/粉碎/分级单元塞进 flowsheet 的骨架。提示本篇所有命令与版本号均以官方 install_instructions.txt 与 GitHub Release v1.0.0 为准未作任何编造后续篇章复现时报错先回来把本文第三节的坑逐条对一遍。本篇认知问题回显FAQQ1为什么 PharmaPy 不能pip install pharmapy非要用 conda 从源码装A1PharmaPy 官方不发布 PyPI“you must use the source code”也没有pip install pharmapy渠道加之依赖 assimulo 只能 conda-forge 提供故从 GitHub 源码setup.py develop安装并全程用 conda。Q2assimulo 是什么为什么只能从 conda-forge 装A2assimulo 是封装 SUNDIALSLLNL 的 ODE/DAE 求解器含 CVODE/IDA的高阶求解器绑定库assimulo3.4.3它依赖带预编译共享库 BLAS/LAPACK 的原生二进制只在 conda-forge 全平台分发。Q3为什么指定 Python 3.9还锁 numpy2 / scipy1.14 / cython3A3官方 install_instructions.txt 指定 Python 3.9numpy2 防 C-ABI 段错误、scipy1.14 保护被移除的内部接口、cython3 规避新语法变更共同对齐 PharmaPy 源码的编译与运行条件。Q4setup.py develop与install有何区别为何二次开发用 developA4develop以可编辑链接方式挂载源码到 site-packages不复制不打包改PharmaPy/里的代码立即生效本系列要新增 RollerCompactor/Mill/Classifier 等类用develop可避免每次重装。Q5怎么确认真的装好了件。Q4setup.py develop与install有何区别为何二次开发用 developA4develop以可编辑链接方式挂载源码到 site-packages不复制不打包改PharmaPy/里的代码立即生效本系列要新增 RollerCompactor/Mill/Classifier 等类用develop可避免每次重装。Q5怎么确认真的装好了A5跑cd tests python reactor_tests.py无 ERROR 且退出码 0再看import pharmapy成功、numpy2、scipy1.14、assimulo3.4.3。单纯 import 不报错不够版本一致性也要核。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑