执行时出现该错误似乎有点奇怪predict_edu.py
,因为它与以下目录位于同一目录中predictors.py
,因此,使用绝对导入,例如from predictors import predictor_transformer
(没有点.
操作员)应正常按预期工作。但是,如果错误仍然存在,您可以尝试以下几个选项。
Option 1
您可以添加的父目录predictors
文件到系统PATH
变量,在尝试导入模块之前,如所述here https://stackoverflow.com/a/71080756/17865804。这对于较小的项目应该可以正常工作。
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
from predictors import predictor_transformer
Option 2
使用相对导入,例如from .predictors import...
,并确保从包的父目录运行脚本,如下所示。这-m option https://docs.python.org/3/using/cmdline.html#cmdoption-m“搜索sys.path https://docs.python.org/3/library/sys.html#sys.path对于指定的模块并执行其内容__main__ https://docs.python.org/3/library/__main__.html#module-__main__模块”,而不是作为顶级脚本。阅读有关-m
以下参考文献中的选项:[1] https://docs.python.org/3/using/cmdline.html#cmdoption-m, [2] https://stackoverflow.com/questions/7610001/what-is-the-purpose-of-the-m-switch, [3] https://stackoverflow.com/questions/52441280/what-does-the-m-option-stand-for-in-python, [4] https://stackoverflow.com/questions/22241420/execution-of-python-code-with-m-option-or-not, [5] https://stackoverflow.com/questions/50821312/meaning-of-python-m-flag, [6] https://stackoverflow.com/questions/46319694/what-does-it-mean-to-run-library-module-as-a-script-with-the-m-option。在这里阅读有关“相对导入”的更多信息:[1] https://softwareengineering.stackexchange.com/questions/159503/whats-wrong-with-relative-imports-in-python, [2] https://stackoverflow.com/questions/1918539/can-anyone-explain-pythons-relative-imports, [3] https://stackoverflow.com/Questions/16981921/relative-imports-in-python-3, [4] https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time.
python -m video_discovery.data_science.predict_edu
但是,那PEP 8 风格指南 https://www.python.org/dev/peps/pep-0008/#imports一般情况下建议使用绝对导入。
建议绝对导入,因为它们通常更具可读性
并且往往表现得更好(或者至少给出更好的错误消息)
如果导入系统配置不正确(例如当
包内的目录最终位于 sys.path 上)
然而,在某些情况下,绝对导入可能会变得非常冗长,具体取决于目录结构的复杂性,如下所示。另一方面,“相对导入可能会很混乱,特别是对于目录结构可能发生变化的共享项目”。它们也“不如绝对的可读,并且很难判断导入资源的位置”。阅读更多关于Python导入 https://realpython.com/python-import/ and 绝对进口与相对进口 https://realpython.com/absolute-vs-relative-python-imports/.
from package1.subpackage2.subpackage3.subpackage4.module5 import function6
Option 3
将包含您的包目录的目录包含在PYTHONPATH https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH并使用绝对导入代替。PYTHONPATH
用于设置用户自定义模块的路径,以便可以直接导入到Python脚本中。这PYTHONPATH
变量是一个字符串,其中包含需要添加到的目录列表sys.path https://docs.python.org/3/library/sys.html#sys.pathPython 的目录列表。该变量的主要用途是允许用户导入尚未制作成可安装的 Python 包的模块。了解更多相关信息here https://bic-berkeley.github.io/psych-214-fall-2016/using_pythonpath.html and here https://bic-berkeley.github.io/psych-214-fall-2016/sys_path.html.
例如,假设您有一个名为video_discovery
(under /Users/my_user/code/video_discovery
)并想添加目录/Users/my_user/code
to the PYTHONPATH
:
On Mac
- Open
Terminal.app
- 打开文件
~/.bash_profile
在你的文本编辑器中 – 例如atom ~/.bash_profile
- 将以下行添加到末尾:
export PYTHONPATH="/Users/my_user/code"
- 保存文件。
- Close
Terminal.app
- Start
Terminal.app
再次读取新设置,然后输入echo $PYTHONPATH
。它应该显示类似的内容/Users/my_user/code
.
On Linux
-
打开您最喜欢的终端程序
-
打开文件~/.bashrc
在你的文本编辑器中 – 例如atom ~/.bashrc
-
将以下行添加到末尾:export PYTHONPATH=/home/my_user/code
-
保存文件。
-
关闭您的终端应用程序。
-
再次启动终端应用程序,读取新设置,
并输入echo $PYTHONPATH
。它应该显示类似的内容/home/my_user/code
.
在 Windows 上
- Open
This PC
(or Computer
),在内部右键单击并选择Properties
.
- 从计算机属性对话框中,选择
Advanced system settings
在左侧。
- 从高级系统设置对话框中,选择
Environment variables
button.
- 在环境变量对话框中,单击
New
button 在里面
对话框的上半部分,制作一个新的用户变量:
- 给出变量name as
PYTHONPATH
and in value添加路径到
你的模块目录。选择OK
and OK
再次保存该变量。
- 现在打开一个cmd窗口并输入
echo %PYTHONPATH%
确认环境变量设置正确。Remember打开一个新的 cmd 窗口来运行您的 Python 程序,以便它选择以下位置的新设置PYTHONPATH
.
Option 4
另一种解决方案是以可编辑状态安装软件包(对 .py 文件所做的所有编辑将自动包含在已安装的软件包中),如下所述here https://stackoverflow.com/a/50193944 and here https://stackoverflow.com/a/50194143。但是,要使其发挥作用所需的工作量可能会使选项 3 成为您更好的选择。
内容为setup.py
应该如下图所示,安装包的命令应该是pip install -e .
(-e
flag 代表“可编辑”并且.
代表“当前目录”)。
from setuptools import setup, find_packages
setup(name='myproject', version='1.0', packages=find_packages())