Python 问题在脚本中导入我的文件(不在控制台中)

Posted

技术标签:

【中文标题】Python 问题在脚本中导入我的文件(不在控制台中)【英文标题】:Python problem importing my files in script (not in the Console) 【发布时间】:2020-06-27 13:09:15 【问题描述】:

我知道我要问的问题有数千个问题和答案,但我需要对我的特定问题进行解释,因为这是我第一次使用其他人编写的代码,我对导入感到非常困惑。 所以:我正在使用 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:尝试实际导入超出***包 - 绝对路径

但什么都没有,对于 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']

如果我再次问此类问题,我很抱歉,但我无法理解 namema​​in 和所有这些东西的概念,而且我不知道在我的具体情况下该怎么做(我希望能从总体上理解这个话题)

非常感谢!

【问题讨论】:

【参考方案1】:

为了简化这一点并帮助您理解,我要说的第一件事是在根目录中有一个 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

【讨论】:

以上是关于Python 问题在脚本中导入我的文件(不在控制台中)的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Python 中导入我自己的模块

为啥我不能在 react native 中导入我的自定义组件

如何在pydroid中导入模块

为啥不在 Python 中导入转换器?

为啥 python 模块在 shell 中工作而不在脚本中工作?

sh 一个脚本,可以在我的环境中加入我需要的所有服务。