找不到模块错误-从同级目录导入

时间:2019-11-14 22:18:43

标签: python python-import

因此,我尝试了许多关于堆栈溢出的解决方案,但仍然存在问题。

下面是我的项目结构。

project
    | tool1
       | - application.py
    | resources
       | - tools
          | - dao.py

在application.py中,我具有以下导入语句:

from resources.tools.dao import DAO

这在PyCharm中工作正常,但是当我尝试从项目目录(python tool1/application.py)从命令行运行它时,我得到:

ModuleNotFoundError: No module named 'resources'

如果我移入'tool1'文件夹并运行:python application.py

,我会收到相同的错误

我尝试在导入之前添加..,通过PyCharm将其他文件夹设置为我的源根文件夹,并将空白__init__.py文件添加到资源目录。

为什么PyCharm能够找到“资源”,但命令行却找不到?如何更改此设置,以使我的解决方案可在任何位置使用?

如果有帮助,我正在使用Python 3.7和Windows。我愿意重组项目目录,但是将有多个工具/应用程序都将在资源目录中使用dao.py和其他工具,因此资源至少应与其他项目一样高。

谢谢。

4 个答案:

答案 0 :(得分:1)

假设您在每个目录中创建了__ init __.py。您可以添加到系统路径。 它应该从任何地方导入dao。它肯定可以在linux中工作。

# tool1.__init__.py
import sys
import os

CURRPATH, TAIL = os.path.split(os.getcwd())
while CURRPATH != "/":
    if TAIL == 'project':
        if os.path.join(CURRPATH, TAIL) not in sys.path:
            sys.path.append(os.path.join(CURRPATH, TAIL))
        break
    CURRPATH, TAIL = os.path.split(CURRPATH)
from resources.tools.dao import DAO

和在application.py

# tool1.application.py
from __init__ import DAO

答案 1 :(得分:0)

如果project是您的根目录(即,您已初始化此目录的pythonpath),则需要导入如下模块:

from project.resources.tools.dao import DAO

答案 2 :(得分:0)

使用6.45参数运行脚本。即

-m

这使脚本与命名空间中的python -m project.tool1.application包一起运行。 (您可能需要向project添加 init .py文件以使其成为一个包)

答案 3 :(得分:0)

另一种声明父目录路径的方法是:

<div class="p-4 border rounded">
    <table id="tblData" class="table table-striped table-bordered" style="width:100%">
        <thead class="thead-dark">
            <tr class="table-info">
                <th>Opis</th>
                <th>Kratak Opis</th>
                <th>Datum i vrijeme slanja</th>
                <th>Vrsta Tiketa</th>
                <th>Status</th>
                <th>Korisnik</th>
                <th></th>
            </tr>
        </thead>
    </table>
</div>

然后这条线就可以正常工作了:

import os, sys

dir_path = os.path.dirname(os.path.realpath(__file__))
parent_dir_path = os.path.abspath(os.path.join(dir_path, os.pardir))
sys.path.insert(0, parent_dir_path)