首页 > 解决方案 > Python将外部模块编译到项目文件夹中

问题描述

我需要为我的大学提交一份涉及图表的作业。由于允许使用外部模块,我使用 networkx 来完成工作,我需要将算法提交给在线检查器,以查看我的解决方案是否适用于不同的输入。问题是我需要在 /lib 子文件夹中提交包含我的代码和库的 zip。我所做的是执行networkx的setup.py,我从build one复制了lib文件夹并将其放入我的项目zip中,但网站告诉我: 错误

所以我的最后一棵树是

-文件.py

-lib/networkx/....

有谁知道如何解决这类问题?

标签: python

解决方案


tl/dr python -m pip install -I --only-binary=":all:" --target lib networkx,然后添加import sys; sys.path.append('path/to/lib')到您的脚本中。


问题是,为了使 networkx 工作,您需要将其所有依赖项及其所有依赖项包含在lib. 不幸的是,运行setup.py不会为您做到这一点,并且并非所有这些依赖项都适用于所有平台。例如,networkx 的依赖项之一是 numpy,它是用 C 而不是 python 实现的,并且必须针对不同的目标架构单独编译。

所有这些复杂性都说明了为什么 Python 程序通常不以这种方式分布。如果您的程序检查器可以访问互联网,最简单的解决方案是在您的程序中添加几行以通过 pip 安装 networkx。

如果您无法通过 Internet 安装软件包,您可以lib使用以下命令在目录中预构建 networkx 及其依赖项。

python -m pip install -I --only-binary=":all:" --target lib networkx

-I选项是忽略您机器上已安装的软件包。这应该确保所有必要的依赖项都以lib. 您可能需要使用--platform--python-version标志来确保您获得正确版本的 networkx 及其在线检查器的依赖项。如果您不知道在线检查器使用的平台或 python 版本,请在您的程序中添加几行以打印输出,sys.platform然后sys.version再尝试导入 networkx。

您可能还需要添加lib到搜索路径以确保 python 解释器可以找到您放入其中的模块。您可以为此使用sys.path.append('path/to/lib')内置sys模块。


推荐阅读