【问题标题】:Why am I receiving an error when importing modules housed in a package built in a Virtual Environment?为什么在导入虚拟环境中构建的包中的模块时收到错误消息?
【发布时间】:2022-01-20 15:18:28
【问题描述】:

当我在虚拟环境中运行我的代码时,我得到的输出与我在虚拟环境之外的容器中运行代码不同。相同的文件结构、相同的代码在 AB.py 中,以及相同的导入语句在 init.py 和 AB.py 文件中。有关更多详细信息,请参见图像。非常基本,但我不想知道为什么当父容器位于虚拟环境中时 python 无法识别我的模块之一。谢谢!

    Container A
    >AB.py
    >>Package_A
    >>>>__init__.py,
    >>>>Module_A.py,
    >>>>Module_B.py,
    >>>>Module_C.py
    
    
    Virtual Environment Container A
    >AB.py
    >>Package_A
    >>>>__init__.py,
    >>>>Module_A.py,
    >>>>Module_B.py,
    >>>>Module_B.py

[See image here] : https://i.stack.imgur.com/RJGpk.png

    ## Package AB.py     
    from Package_A import Mod_A, Mod_B, Mod_C
    Module_A.Func_A()
    Module_B.Func_B()
    Module_C.Func_C()
    
    
    ## __init__.py
    from a import func_a
    from b import func_b
    
    ## Module_A.py
    def Func_A():
        print("how")
    
    
    ## Module_B.py
    def Func_B():
        print("are")
    
    
    ## Module_C.py
    def Func_C():
        print("you")
    

在容器中运行 AB.py 返回

how
are
you

在虚拟环境中运行 AB.py 返回

ModuleNotFoundError: No module named 'a'

【问题讨论】:

  • 模块引用同文件名from Module_A import Func_A,同函数引用函数名。
  • 您的虚拟环境是否有bin/ 子目录,您是否在shell 提示符下. bin/activate? (如果这解决了您的问题,我会发布它作为答案。)
  • @scootermefecit 是的,虚拟环境有一个 bin 目录。此外,我确实通过进入 venv 目录并使用 source ./bin/activate 激活了我的 venv
  • @chickitychinachinesechicken 我以后会这样做。这个练习是我试图理解和锁定容器、包、模块术语的尝试。当我在 venv 中执行此练习时,我刚刚发现 python 返回了不同的结果。我花了 1-2 个小时试图弄清楚发生了什么。

标签: python python-3.x package containers virtualenv


【解决方案1】:

找到了解决方案,我需要在 init.py 文件中更改我的导入 lin。我将其更改为:

    from a import func_a
    from b import func_b

    from .a import func_a
    from .b import func_b

venv 和非 venv 都是这种情况。我没有指定父文件夹。

【讨论】:

    猜你喜欢
    • 2019-07-30
    • 2023-01-14
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多