编译的Python版本:导入时出现ModuleNotFoundError

conda我有一个在python 3.7.7(在 Linux 上)运行的环境中的项目。当我重新编译相同版本的 python (3.7.7) 并将可执行文件放置/替换在同一位置时,我希望程序以相同的方式运行,但导入失败。


使用原始版本的 python:


(condaenv) mypc:~/Proj$ /home/me/.conda/envs/condaenv/bin/python3.7.bak

Python 3.7.7 (default, Mar 26 2020, 15:48:22) 

[GCC 7.3.0] :: Anaconda, Inc. on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> import gym

>>> quit()

编译后的版本:


(condaenv) mypc:~/Proj$ /home/me/.conda/condaenv/proj/bin/python3.7

Python 3.7.7 (default, Sep 24 2020, 16:28:06) 

[GCC 9.3.0] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> import gym

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ModuleNotFoundError: No module named 'gym'

>>> quit()

环境变量应该与我从同一位置、同一终端上运行时相同,而不会在两次调用之间更改它。由于第一次导入没有任何问题,所以软件包安装得很好。


系统导入sys在两个版本中都可以正常工作,但我必须LD_LIBRARY_PATH在编译版本之前导出,而“正常”版本则不然。但是在两次调用之间保持LD_LIBRARY_PATH不变不会改变任何东西。


第二次调用找不到匹配的包会发生什么情况?我缺少什么?


红颜莎娜
浏览 77回答 2
2回答

慕村9548890

和标志可能--without-pymalloc会导致错误。将 miniconda 中的二进制文件替换为使用编译库构建的二进制文件或阻止导入已编译的库,例如和。不使用任何标志(即)进行编译不会导致这些错误。导入编译库时进行编译也不会引发错误。--with-pydebug./configurepython3.7./configure --without-pymalloc./configure --with-pydebugmathnumpy./configure && make./configure --with-valgrind较旧的答案:您可以尝试使用conda-forge 使用的配置标志吗?使用这些标志,我能够python3.7在 conda 环境中替换二进制文件,并且导入继续工作。如果我使用 OP 的标志(即--without-pymalloc --with-pydebug --with-valgrind),则导入编译的库不起作用(例如 math、numpy)。curl -L https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tar.xz | tar xJ cd Python-3.7.7./configure \     --prefix=/tmp/python3.7 \     --enable-ipv6 \     --with-ensurepip=no \     --with-computed-gotos \     --with-system-ffi \     --enable-loadable-sqlite-extensions \     --with-lto \     --enable-optimizations \     --with-valgrind make -j该解决方案涉及这些标志之一 - 也许--with-lto或--enable-optimizations。

慕森王

你在哪里编译了新的Python?缺少 lib 可能librt.so.1是错误消息的罪魁祸首。是否有机会安装该librt软件包(取决于您的 Linux 风格)并重新编译 Python。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python