无法从 pycharm 中的源目录导入模块

Tyt*_*ans 6 import module pycharm python-3.6

这个问题以前曾被问过 - 但我无法用任何答案来解决它。我在pycharm中打开了一个项目文件夹(注意项目文件夹不在../PycharmProject/...目录中。

我的结构非常基本:

project_title (folder)
             |--src (folder)
                  |-- app.py  
                  |-- pipeline_tools (folder)
                     |-- helpers.py
                     |-- other modules
Run Code Online (Sandbox Code Playgroud)

我尝试了所有可能的解决方案和组合,但是当app.py我尝试从任一模块导入函数时,tools我收到错误。

此外,Pycharm 用红色强调了以下声明:

1) from pipeline_tools.helpers import a_certain_function(红色下划线带有“未解决的参考”)

但以下内容没有给我带来红色:

2)from .pipeline_tools.helpers import a_certain_function(无红色下划线,注意相对导入)

事实上,我__init__.py在模块内部有或没有 a 没有任何改变 - 我仍然收到以下两个错误:

对于 1)

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/gabriele/pycharm-2019.1.1/helpers/pydev/_pydev_bundle/pydev_import_hook.py", line 21, in do_import
    module = self._system_import(name, *args, **kwargs)
ModuleNotFoundError: No module named 'pipeline_tools'

Run Code Online (Sandbox Code Playgroud)

为 2)

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/gabriele/pycharm-2019.1.1/helpers/pydev/_pydev_bundle/pydev_import_hook.py", line 21, in do_import
    module = self._system_import(name, *args, **kwargs)
ModuleNotFoundError: No module named '__main__.pipeline_tools'; '__main__' is not a package
Run Code Online (Sandbox Code Playgroud)

我确信我尝试过的东西:

1)去settings > Project Structure检查并将content root.../project_title标记为“来源” - 它是蓝色的。

2)__init__.pypipeline_tools文件夹中添加并在/src文件夹中尝试所有可能的组合。

3)使用下面的代码检查项目文件夹的路径是否是路径字符串的一部分 - 它位于末尾

import sys
print(sys.path)
Run Code Online (Sandbox Code Playgroud)

4)使用以下代码将项目路径移动到sys.path的开头: sys.path.insert(0,'path/to/project_title')

5)只是尝试PYTHONPATH像这样打印:

os.environ['PYTHONPATH'].split(os.pathsep)
Run Code Online (Sandbox Code Playgroud)

而且我的项目目录不在其中

我现在有点不知所措。不知道发生了什么事。

Tyt*_*ans 5

由于某些该死的原因,我不明白将src目录设置为我的源sources root而不是project_title目录(无论如何都包含它......但我知道什么)有效。

\n\n

所以解决方案是:

\n\n

-> 设置 \n -> 项目结构 \n -> 删除以前的内容根路径并将内容源设置为该src目录

\n\n

像这样导入:

\n\n

from pipeline_tools.helpers import func_1, func_2

\n\n

注意:我的文件夹中没有文件__init__.py,因为我相信我读到它们不再需要了。

\n\n
\n

在 Python 3.3 之前,文件系统目录和 zip 文件中的目录必须包含init .py 才能被识别为 Python 包目录。即使导入包时没有要运行的初始化代码,解释器仍然需要一个空的init .py 文件来查找该目录中的任何模块或子包。

\n\n

这在 Python 3.3 中发生了变化:现在 sys.path 上名称与正在查找的包名称匹配的任何目录都将被识别为该包的贡献模块和子包。

\n
\n\n

来自Nick Coghlan\xe2\x80\x99s Python 笔记\n

\n

  • 如果“project_title”是您的源,您的导入应如下所示:“from src.pipeline_tools.helpers import myfunction”。当您将导入编写为“from pipeline_tools...”时,您隐含地假设您的源根目录是“src”,这就是为什么当您这样定义“src”时它会起作用。设置此选项的一种快速方法是右键单击要作为源根目录的文件夹,然后单击“将目录标记为 -&gt; 源根目录”。该目录应该在树中以蓝色显示。 (3认同)