Python 3.x Python3导入更改

Python 3.x Python3导入更改,python-3.x,Python 3.x,我有一个使用同一个包中定义的枚举的模块。我想在本地运行它进行自我测试,并从其他包访问它,但我无法获得enum的导入来处理这两种情况 我在sub和proj目录中都尝试了一个空白的 我尝试过python-m的各种变体,但没有成功 以下是显示我的问题的最基本代码: /my/proj |----sub | |---e1.py | |---one.py | |---two.py |-p1.

我有一个使用同一个包中定义的枚举的模块。我想在本地运行它进行自我测试,并从其他包访问它,但我无法获得enum的导入来处理这两种情况

我在sub和proj目录中都尝试了一个空白的

我尝试过python-m的各种变体,但没有成功

以下是显示我的问题的最基本代码:

    /my/proj
        |----sub
        |      |---e1.py
        |      |---one.py
        |      |---two.py
        |-p1.py
        |-p2.py

    ----
    $ cat /my/proj/sub/e1.py
    from enum import Enum
    class UsefulEnums(Enum):
        ZERO = 0

    ----
    $ cat /my/proj/sub/one.py
    from e1 import UsefulEnums as E
    def profound():
       print('The value of {} is {}'.format(E.ZERO.name, E.ZERO.value))
    if __name__ == '__main__':
       profound()

    /my/proj/sub$ python one.py
    The value of ZERO is 0
    ----
    $ cat /my/proj/sub/two.py
    # note the dot before the module name. No other change from one 
    from .e1 import UsefulEnums as E
    def profound():
       print('The value of {} is {}'.format(E.ZERO.name, E.ZERO.value))
    if __name__ == '__main__':
       profound()

    /proj/sub$ python two.py 
    Traceback (most recent call last):
      File "two.py", line 1, in <module>
        from .e1 import UsefulEnums as E
    ModuleNotFoundError: No module named '__main__.e1'; '__main__' is not a package

    ----
    $ cd /my/proj
    /my/proj$ cat p1.py
    import sub.one as a
    if __name__ == '__main__':
       a.profound()

    /my/proj$ python p1.py
    Traceback (most recent call last):
      File "p1.py", line 1, in <module>
        import sub.be1 as a
      File "/home/esmipau/delete_me/proj/sub/one.py", line 1, in <module>
        from e1 import UsefulEnums as E
    ModuleNotFoundError: No module named 'e1'
    ----
    /my/proj$ cat p2.py
    import sub.two as a
    if __name__ == '__main__':
       a.profound()

    /my/proj$ python p2.py
    The value of ZERO is 0
/my/proj
|----潜艇
||--e1.py
||--1.py
||--2.py
|-p1.py
|-p2.py
----
$cat/my/proj/sub/e1.py
从枚举导入枚举
类可用枚举(枚举):
零=0
----
$cat/my/proj/sub/one.py
从e1导入可用枚举作为E
def():
print({}的值为{})。格式(E.ZERO.name,E.ZERO.value))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
深刻的
/my/proj/sub$python one.py
零的值是0
----
$cat/my/proj/sub/two.py
#注意模块名称前的点。没有其他变化
从.e1导入可用枚举作为E
def():
print({}的值为{})。格式(E.ZERO.name,E.ZERO.value))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
深刻的
/项目/子$python 2.py
回溯(最近一次呼叫最后一次):
文件“two.py”,第1行,在
从.e1导入可用枚举作为E
ModuleNotFoundError:没有名为“\uuuu main\uuuu.e1”的模块__main__;不是一个包
----
$cd/my/proj
/我的/项目$cat p1.py
将sub.one作为
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
a、 深刻的
/my/proj$python p1.py
回溯(最近一次呼叫最后一次):
文件“p1.py”,第1行,在
将sub.be1作为
文件“/home/esmipau/delete_me/proj/sub/one.py”,第1行,在
从e1导入可用枚举作为E
ModuleNotFoundError:没有名为“e1”的模块
----
/我的/项目$cat p2.py
将sub.2作为
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
a、 深刻的
/my/proj$python p2.py
零的值是0
从“sub”目录运行时,one.py按预期工作,two.py失败,出现“ModuleNotFoundError”错误,如上所述。 在父代码中导入并从父目录运行时,two.py现在可以工作,而one.py失败,并出现另一个“ModuleNotFoundError”错误。 我想要“sub”目录中的一个3.py,它使用e1.py中定义的枚举,可以在本地运行以进行自检等,并且可以从不在同一目录中的外部模块中包括

---编辑关闭为重复建议--
这与已经提出的其他问题不同,例如,我要求一个模块在同一目录中导入另一个模块,而不管该模块是在本地执行还是从另一个模块导入

我遇到了类似的问题,这解决了它: 尝试创建
\uuuu init\uuuu
文件,如下所示:

import my.proj.sub.e1
然后在要使用“添加”的文件中:

from my.proj.sub import UsefulEnums as E
鉴于结构:

/proj
   |---/pkg
   |    |---> usefulEnums.py
   |    |---> usefulCode.py 
   |--> myProj.py 
我希望能够在自检模式下运行usefulCode.py,并希望在myProj中导入和使用它

$ cat proj/pkg/usefulEnums.py
from enum import Enum
class UsefulEnums(Enum):
    ZERO = 0 

$ cat proj/pkg/usefulCode.py
if __package__ is None:
    # works with python <path/>tcp.py
    from usefulEnums import UsefulEnums as E
else:
    # works with python -m pkg.tcp 
    # or when imported by another module 
    from pkg.usefulEnums import UsefulEnums as E
    # This works as well and appears more more portable and pythonic
    # but the logic that makes it work is obtuse and fragile
    # and it doesn't work if __package__ is None (even though it should!) 
    # from .usefulEnums import UsefulEnums as E    

 def profound():
     print('The value of {} is {}'.format(E.ZERO.name, E.ZERO.value))
 if __name__ == '__main__':
     profound()
以上是我所接受的关于我所述问题的答案,但我无法理解其中的道理


我不明白为什么在未定义\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>时,“点”导入的行为不能按预期工作。当然,它总是意味着相对于当前包的导入,如果没有明确定义包,那么为什么它不意味着从与当前模块相同的目录导入,而当前模块可以被认为是当前默认包

请修复您的格式运行
python-m…
从e1导入有用的枚举,因为E
中应该包含for,您正在哪个目录下运行以尝试执行此代码?这可能与相对导入不同。可能的重复项不适用于与e1位于同一“子”目录中的模块,因此它们不能在独立或自检模式下运行。
cat proj/myProj.py
from pkg.usefulEnums import UsefulEnums as E
import pkg.usefulCode as u
if __name__ == '__main__':
    u.profound()