【问题标题】:Cannot import modules from parent folder无法从父文件夹导入模块
【发布时间】:2021-11-30 14:57:51
【问题描述】:

我已经为此奋斗了好几个星期,阅读了很多(过时的)文章,尝试了很多不同的建议解决方案,但都没有成功。而且我仍然相信我不会尝试做一些困难的事情......

我有以下文件夹结构

├── script.py 
├── lib 
│   ├── lonlatboxes.py
│   ├── utils.py

我正在使用文件夹lib 来存储script.py 中使用的一些库。

utils.py我有

from sqlalchemy import create_engine # python package
from lonlatboxes import lonlatboxes # my module

lonlatboxes.py我有

lonlatboxes = {
    'Africa': [-26.0, 63.0, -41.0, 37.0],
}

script.py 我愿意

import lib.utils

这会导致错误

      1 from sqlalchemy import create_engine
----> 2 from lonlatboxes import lonlatboxes
      3 

ModuleNotFoundError: No module named 'lonlatboxes'

我猜是因为 sys.path 已解决 w.r.t.父文件夹而不是 lib。注意lib.utils文件被找到了!

我应该如何解决这个问题?或者......我是否完全反对 Python 导入? 我认为添加sys.path 的路径不应该是正确的解决方案。

请注意,我不想创建包。我只有一组脚本和小型库,并希望避免将所有内容都放在同一个文件夹中,而是将它们分开,以便我可以有更多的订单:)

【问题讨论】:

  • 尝试将空的init.py添加到lib文件夹
  • 也许可以试试from lib.lonlatboxes import lonlatboxes(在utils.py)?这似乎对我有用。我认为这条线是在script.py 文件夹中调用的。我认为使用lib. 不会借用你,除非你希望用户直接打开utils.py。在这种情况下,您可以通过在utils.py 中键入以下内容来检测它:if __name__ == "__main__":from lonlatboxes import lonlatboxes else: from lib.lonlatboxes import lonlatboxes
  • init.py 不起作用。我不知道为什么很多文章都建议它作为解决方案,我相信它过去曾经有效。

标签: python python-import


【解决方案1】:

您需要做的就是更改utils.py 中的第二个import 并使其相对于script.py 的位置:

utils.py

from sqlalchemy import create_engine # python package
from .lonlatboxes import lonlatboxes # my module

【讨论】:

  • 好的,谢谢!我过去曾尝试过相对导入,但不知何故他们从未成功过。这是有道理的。
  • Guido:确实,许多人在相对导入方面存在问题 - 请参阅 Relative imports for the umpteenth time
【解决方案2】:

尝试将其添加到您的 script.py 中

import sys
sys.path.append('..')
import lib.utils

然后将您的 utils.py 导入部分修改为:

from sqlalchemy import create_engine
from .lonlatboxes import lonlatboxes

【讨论】:

  • 这正是我想要避免的 :( 从我阅读的内容中添加到 sys.path 的路径不应该是首选解决方案。
【解决方案3】:

您也可以使用 PYTHONPATH 环境变量。更多关于 PYTHONPATH 的信息:https://www.tutorialspoint.com/What-is-PYTHONPATH-environment-variable-in-Python

要设置它,请执行以下操作:

  1. cd到你要添加的目录
  2. 执行以下操作之一(取决于您的 shell)
# Linux: 
export PYTHONPATH=$PWD
echo $PYTHONPATH

Command Prompt: 
set PYTHONPATH=%cd%
echo %PYTHONPATH%

Powershell: 
$env:PYTHONPATH=$(Get-Location)
echo $Env:PYTHONPATH

【讨论】:

    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多