gpt4 book ai didi

Python 没有名为 X 的模块 - 绝对导入

转载 作者:行者123 更新时间:2023-12-03 18:34:43 25 4
gpt4 key购买 nike

在我开始之前,我想说 - 我知道,有无数类似的问题,但我找不到我的问题的答案。我有一个这样的目录结构:

.
├── project
│   ├── A
│   │   ├── __init__.py
│   │   └── somelib.py
│   ├── B
│   ├── C
│   │   └── C
│   │   ├── foo.py
│   │   └── __init__.py
│   └── __init__.py
└── run.sh
运行.sh : python3 project/C/C/foo.py foo.py : from project.A.somelib import somefunc
VS Code 实际上在 foo.py 中获得了智能感知。 - 它告诉我可以从 somelib 导入哪些函数/变量.但是当我运行 run.sh ,我收到此错误消息:
from project.A.somelib import somefunc
ModuleNotFoundError: No module named 'project'
有没有办法在保留这个目录结构的同时解决这个问题?
  • 添加 project/__init__.py什么都没改变
  • sys.pathfoo.py看起来像这样:
  • ['/home/dabljues/projects/project/project/C/C', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/usr/lib/python3.7/site-packages']
    限制:
  • 我也不能修改sys.path在文件中也没有PYTHONPATH在运行脚本之前
  • 我无法安装任何东西
  • 我没有 sudo 访问权限
  • 我无法创建 virtualenv,因为脚本应该是可下载且可以快速执行的
  • 最佳答案

    像 VSCode 或 Pycharm 这样的 IDE 会对项目做出自己的假设,并且通常会正确链接模块,即使最终运行代码的解释器不能。
    原因project.A.somelib在您的 sys.path 中可以看到找不到输出,它为您提供了 python 搜索模块的位置。由于'/home/dabljues/projects/project/project'不包括在内,python 无法在运行时解决它。

    快速破解
    您可以手动将路径添加到 sys.path , 在源文件中运行 import sys; sys.insert(0, '/home/dabljues/projects/project/project/')foo.py在任何其他导入发生之前,或通过运行 export PYTHONPATH="${PYTHONPATH}:/home/dabljues/projects/project/project/"run.sh 之前的 shell 中.

    安装项目
    由于看起来您正在开发一个库,因此您不妨使用 python 提供的机制来使库可共享,从而解决任何导入问题。添加最小 setup.py到项目根目录(即 /home/dabljues/projects/project/project/setup.py ):

    from setuptools import setup, find_packages


    setup(
    name='project',
    version='0.1.0',
    packages=find_packages('project'),
    )
    并以可编辑模式安装您的项目:
    $ python3 -m pip install -e .
    这将在您的 python3 中添加一个链接可执行文件的 site-packages指向项目根目录,这样无论何时你使用 python3 运行任何东西都可以访问它.

    测试
    我包括 print(__name__)在所有 python 文件的顶部以获得一些输出。
    在不安装包的情况下运行 run.sh:
    $ sh run.sh 
    Traceback (most recent call last):
    File "project/C/C/foo.py", line 1, in <module>
    from project.A.somelib import somefunc
    ModuleNotFoundError: No module named 'project'
    安装后
    $ sh run.sh 
    __main__
    project.A.somelib
    如您所见, project.C.C.foo作为脚本执行,但它会找到所有以 project 开头的导入因为 project已安装。

    关于Python 没有名为 X 的模块 - 绝对导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57570677/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com