当所有目录都具有__init__.py时,为什么我的项目因ModuleNotFoundError而失败?

时间:2019-01-28 15:08:02

标签: python

第一件事是我不是python专家。

我有一个项目,该项目由PyChart在Mac上运行,并且运行良好。自从我移回Windows之后,我想在Windows Linux子系统(也称为Ubuntu Bash命令行)中运行我的python项目。背后的原因如下:

  • Ubuntu提供了更大的灵活性来处理不同的python版本
  • 我连接到需要thrift-ssl和其他软件包的kerberized Impala,并且它们是按安装时间编译的,在Windows上,我很难安装这些软件包。 Ubuntu的魅力十足。由于Windows上的此PyCharm不可选项
  • 我连接到的服务需要kerberos身份验证。在Windows上运行的PyCharm可以管理Ubuntu并在此处执行开发的脚本,但是kerberos(kinit)身份验证带来了额外的复杂性,并且要求我将域密码放在脚本或文件中。对我来说这是不行的。

因此,我将项目移至Ubuntu Bash。我创建了virtualenv,将其激活并尝试运行脚本。它失败,并显示以下错误:

(venv) desktop@DESKTOP-ST034M2:/mnt/c/DEV/project$ ./etl/finance/exports/export.py
Traceback (most recent call last):
  File "./etl/finance/exports/export.py", line 5, in <module>
    from util import db_connection
ModuleNotFoundError: No module named 'util'

这是项目的样子:

project/
project/__init__.py

project/etl/
project/etl/__init__.py

project/etl/finance/
project/etl/finance/__init__.py

project/etl/finance/exports
project/etl/finance/exports/__init__.py
project/etl/finance/exports/export.py

project/util
project/util/__init__.py
project/util/db_connection.py

export.py如下所示:

#!/usr/bin/python3
import csv
import datetime

from util import db_connection

c = db_connection.Connect("finance_db")

每个目录中都有__init__.py意味着-至少对我来说-python将目录作为软件包/模块进行管理,因此我可以包含来自不同目录的python文件。因此,我的假设是,如果我从project目录(这是项目的根目录)执行脚本,那么python应该在目录中找到文件。

我在这里做错了什么?我应该设置和/或检查其他哪些参数来运行脚本?

1 个答案:

答案 0 :(得分:1)

尝试

PYTHONPATH=. python youstartfile.py