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