Python 在脚本中导入我的文件时出现问题(不是在控制台中)
Python problem importing my files in script (not in the Console)
我知道我要问的问题有数以千计的问题和答案,但我需要对我的特定问题进行解释,因为这是我第一次使用别人编写的代码,而且我对导入真的很困惑。
所以:我正在使用 Pycharm 并且我直接从 gitLab 存储库中提取了所有代码(按目录组织)。
这是结构:
C:\users\marco\PycharmProjects\Avv
└──ads-ai
└──src
└──dataElab
└──dataprep.py
└──datamod.py
├──doc2vec
├──logger
└──log_setup.py
├──res
├──mod1.py
├──mod2.py
├──mod3.py
└──rest
└──api.py
我的起始脚本是 api.py ,我需要在其中导入 mod1.py -
但开始写作
import mod1
给我一个错误。
问题也是在 mod1 上,还有其他导入:
from logger import log_setup
from dataElab import dataprep, datamod
所有导入都给我错误 'NoModuleFound'。
我试过了:
- 添加带有 sys.path.append 的路径
- 相对路径(来自 .. import mod1)但给我 ValueError: attempted realtive import beyond top-level package
-绝对路径
但没有,我总是出现 "no module" 错误,对于 mod1 或 log_setup。
我想使用 Pycharm 的脚本,而不是 Python 控制台。
如果我检查 os.getwd() --> C:\users\marco\PycharmProjects\Avv\ads-ai\src\rest (应该是正确的)。
并与 sys.path --->
['C:\Users\marco.onnis\PycharmProjects\Avvocatura2020\ads-ai\src\restAPI', 'C:\Users\marco.onnis\PycharmProjects\Avvocatura2020', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020\python36.zip', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020\DLLs', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020\lib', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020\lib\site-packages', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020\lib\site-packages\xlsxwriter-1.2.8-py3.6.egg']
如果我再次问这类问题,我很抱歉,但我在理解 name , main[= 的概念时遇到了问题42=] 和所有那些东西,我不知道在我的具体情况下该怎么做(我希望那时能大致理解这个主题)
非常感谢!
为了简化这一点并帮助您理解,我要说的第一件事是在根目录中有一个 main.py。
C:\users\marco\PycharmProjects\Avv
└──ads-ai
└──main.py # main script to run your code
└──src
└──dataElab
└──dataprep.py
└──datamod.py
├──doc2vec
├──logger
└──log_setup.py
├──res
├──mod1.py
├──mod2.py
├──mod3.py
└──rest
└──api.py
这里有两种导入方法,使用__init__.py
文件或相对导入。相对导入的示例如下所示,您在其中引用目录(或使用点表示法的子目录)
main.py
from src import mod1 # imports mod1.py from '/src' folder
from src.rest import api # imports api.py from '/src/rest' folder
第二种使用 from x import y
的方法是在每个目录中放置一个空的 __init__.py
文件
C:\users\marco\PycharmProjects\Avv
└──ads-ai
└──main.py
└──src
└──__init__.py
└──dataElab
└──__init__.py
└──dataprep.py
└──datamod.py
├──doc2vec
├──logger
└──__init__.py
└──log_setup.py
├──res
├──mod1.py
├──mod2.py
├──mod3.py
└──rest
└──__init__.py
└──api.py
然后您可以像这样导入
main.py
import mod1 # imports mod1.py
import api # imports api.py
因此您可以拥有以下内容
main.py
import api
api.py
import mod1
从不同位置导入时你应该有所不同,因为如果模块共享相同的文件名,只是在不同的目录中,你最终可能会出现名称冲突。在这些情况下,您还应该添加 as
来处理具有相同名称的模块
例如
main.py
from src import mod1 as mod_one
from src.rest import mod1 as mod_1
我知道我要问的问题有数以千计的问题和答案,但我需要对我的特定问题进行解释,因为这是我第一次使用别人编写的代码,而且我对导入真的很困惑。 所以:我正在使用 Pycharm 并且我直接从 gitLab 存储库中提取了所有代码(按目录组织)。
这是结构:
C:\users\marco\PycharmProjects\Avv
└──ads-ai
└──src
└──dataElab
└──dataprep.py
└──datamod.py
├──doc2vec
├──logger
└──log_setup.py
├──res
├──mod1.py
├──mod2.py
├──mod3.py
└──rest
└──api.py
我的起始脚本是 api.py ,我需要在其中导入 mod1.py -
但开始写作
import mod1
给我一个错误。
问题也是在 mod1 上,还有其他导入:
from logger import log_setup
from dataElab import dataprep, datamod
所有导入都给我错误 'NoModuleFound'。 我试过了: - 添加带有 sys.path.append 的路径 - 相对路径(来自 .. import mod1)但给我 ValueError: attempted realtive import beyond top-level package -绝对路径
但没有,我总是出现 "no module" 错误,对于 mod1 或 log_setup。
我想使用 Pycharm 的脚本,而不是 Python 控制台。 如果我检查 os.getwd() --> C:\users\marco\PycharmProjects\Avv\ads-ai\src\rest (应该是正确的)。
并与 sys.path --->
['C:\Users\marco.onnis\PycharmProjects\Avvocatura2020\ads-ai\src\restAPI', 'C:\Users\marco.onnis\PycharmProjects\Avvocatura2020', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020\python36.zip', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020\DLLs', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020\lib', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020\lib\site-packages', 'C:\Users\marco.onnis\AppData\Local\Continuum\anaconda3\envs\Avvocatura2020\lib\site-packages\xlsxwriter-1.2.8-py3.6.egg']
如果我再次问这类问题,我很抱歉,但我在理解 name , main[= 的概念时遇到了问题42=] 和所有那些东西,我不知道在我的具体情况下该怎么做(我希望那时能大致理解这个主题)
非常感谢!
为了简化这一点并帮助您理解,我要说的第一件事是在根目录中有一个 main.py。
C:\users\marco\PycharmProjects\Avv
└──ads-ai
└──main.py # main script to run your code
└──src
└──dataElab
└──dataprep.py
└──datamod.py
├──doc2vec
├──logger
└──log_setup.py
├──res
├──mod1.py
├──mod2.py
├──mod3.py
└──rest
└──api.py
这里有两种导入方法,使用__init__.py
文件或相对导入。相对导入的示例如下所示,您在其中引用目录(或使用点表示法的子目录)
main.py
from src import mod1 # imports mod1.py from '/src' folder
from src.rest import api # imports api.py from '/src/rest' folder
第二种使用 from x import y
的方法是在每个目录中放置一个空的 __init__.py
文件
C:\users\marco\PycharmProjects\Avv
└──ads-ai
└──main.py
└──src
└──__init__.py
└──dataElab
└──__init__.py
└──dataprep.py
└──datamod.py
├──doc2vec
├──logger
└──__init__.py
└──log_setup.py
├──res
├──mod1.py
├──mod2.py
├──mod3.py
└──rest
└──__init__.py
└──api.py
然后您可以像这样导入
main.py
import mod1 # imports mod1.py
import api # imports api.py
因此您可以拥有以下内容
main.py
import api
api.py
import mod1
从不同位置导入时你应该有所不同,因为如果模块共享相同的文件名,只是在不同的目录中,你最终可能会出现名称冲突。在这些情况下,您还应该添加 as
来处理具有相同名称的模块
例如
main.py
from src import mod1 as mod_one
from src.rest import mod1 as mod_1