Python3.7.2 module import issu
the code in the following file structure
_ _ init__.py:
c = 12
Code in ff.py:
from . import c
print(c)
run ff.py to report an error directly:
Traceback (most recent call last):
File "ff.py", line 1, in <module>
from . import c
ImportError: cannot import name "c" from "__main__" (ff.py)
use absolute path"." Referring to folder1, it should be introduced to report errors for peace and society. Python3.7.2 .
first, each module has a _ _ name__ attribute that identifies the name of the module. If a module is imported through import, its name will be the package name. The module name, such as import a.b.c, then c.roomname _ will be 'a.b.c'. And if you are from b import c in the a directory, then c.roomname _ will be'b. C'. If a module is executed directly with the python interpreter, it will be considered top-level module, and its _ _ name__ will be _ _ main__.
when using relative imports, python looks for the import path by tracing up the corresponding level from the module's _ _ name__, and then trying to import the specified module below that level. Again, in the above example, if the current c. Roomnames _ is a. B. C module, use from in the c module. Import DJ python will look for module d under package a.b, which is equivalent to import a.b.d. Use from in the c module.. Import eMagol python will look for module e under package a, which is equivalent to import a.e.
and what happens if you execute python c.py directly under the directory Agamb? At this point c becomes top-level module, and its _ _ name__ will be'_ _ main__', so when python tries to parse the from in the c module. In the import d statement, it is found that the _ _ name__ of the current module is _ _ main__, cannot be traced up one level, so an error is reported: ImportError: cannot import name 'd'from'_ _ main__' (in Python2.x, this error will be ValueError: Attempted relative import in non-package). So we come to the conclusion that cannot use relative imports in the main module executed directly by the interpreter.
back to the subject's question, then I want to use from in ff.py. What does import c do? According to the above conclusion, we must not execute ff.py directly at this time, but import it as a module by using the -m
option of python. We need to execute python-m folder1.ff
in the trymodule folder (note that the module should be written as folder1.ff instead of the file path as folder1/ff.py), so the _ _ name__ of the module ff becomes folder1.ff, and at this point from. Import c will be parsed to import folder1.c, and our goal will be achieved.