【问题标题】:Access file from nested directory under PYTHONPATH从 PYTHONPATH 下的嵌套目录访问文件
【发布时间】:2023-11-22 04:37:01
【问题描述】:

我检查了许多 SO 问题,但没有帮助我解决我的问题。 我有一个文件夹结构:

|--test/foo.py
|--library/   #This is set as my PYTHONPATH
|--|--file1.py
|--|--folder1
|--|--|--util.py

我正在尝试从foo.py 访问util.py

注意:此时我可以从测试文件夹访问库下的所有文件。但是每当我尝试访问 library/folder1/util.py 时,它都会出现错误提示 "ImportError: No module named util"

到目前为止我已经尝试过了:
foo.py

 import os
 import sys
 import file1
 sys.path.insert(0, '/folder1/')
 import util
 util.function_name
 #do something 

这种方法有效,但我无法使用“library/file1.py”。 有没有更清洁的方法来避免这种情况?

注意:这些只是文件夹结构(我维护以区分文件),而不是模块,(所以我相信我不能使用 __init__.py 和类似 import utils.functionname 的东西)

【问题讨论】:

  • 为什么不希望库成为一个包?我会争辩说,如果它不应该是一个包,那么folder1 应该是library 的兄弟。否则,如果它真正是一个库,那么libraryfolder1 应该有一个__init__.py 允许您将library 添加到PYTHONPATH,然后简单地导入:library.folder1.util.functionname跨度>
  • @OozeMeister - 我尝试了你解释的方式。所以现在我在库文件夹 1 下有 init.py。但我仍然无法使用我想要的功能。

标签: python python-2.7 import importerror pythonpath


【解决方案1】:

如果你想强制它,从你的*目录运行它(在你的例子中,包含test/library/的未命名目录):

export PYTHONPATH=$(myarray=($(find "$(pwd -P)" -type d)) \
  && printf '%s\n' "$(IFS=:; printf '%s' "${myarray[*]}")")

这会将您的*目录和每个子目录添加到 python 路径。废话不多说。

【讨论】: