I'm unable to import from Python file in another directory. Directory structure:

some_root/
  - __init__.py
  - dir_0/
    - __init__.py
    - dir_1/
      - __init__.py
      - file_1.py
    - dir_2/
      - __init__.py
      - file_2.py

file_1.py有一些导出的成员:

# file_1.py
def foo():
    pass

file_2.pytry 从file_1.py导入成员:

# file_2.py
from dir_0.dir_1.file_1 import foo

但绝对和相对重要性似乎都不起作用.如何正确导入Python?如果我可以避免使用sys.path.insert,那就好了,但如果没有办法解决这个问题,那么我想情况就是这样.

推荐答案

Don't mess with the search path

你是对的,不要和sys.path混为一谈.这是不推荐的,而且总是一个丑陋的解决方法.有更好的解决方案.

Restructure your folder layout

official Python docs about packaging.

区分project folderpackage folder.我们假设您的some_root文件夹是包文件夹,它也是包的名称(用于import语句).建议将文件包文件夹放入名为src的文件夹中.上面是项目文件夹some_project.该项目文件夹布局也称为"Src布局".

你的情况应该是这样的.

some_project
└── src
    └── some_root
        ├── dir_0
        │   ├── dir_1
        │   │   ├── file_1.py
        │   │   └── __init__.py
        │   ├── dir_2
        │   │   ├── file_2.py
        │   │   └── __init__.py
        │   └── __init__.py
        └── __init__.py

Make your package installable

用该内容创建一个some_project/setup.cfg.在第5行和第6行保留换行符和缩进.它们必须是这样,但我不知道为什么.

[metadata]
name = some_project

[options]
package_dir=
    =src
packages = find:
zip_safe = False
python_requires = >= 3
[options.packages.find]
where = src
exclude =
    tests*
    .gitignore

使用该内容创建some_project/setup.py:

from setuptools import setup
setup()

"Install" the package

这不是通常的安装.请参阅Developement Mode以了解这真正意味着什么.包裹未复制到/usr/lib/python/site-packages中;仅创建链接.

导航到项目文件夹some_project并运行

python3 -m pip install --editable .

不要忘记最后的.分.根据您的操作系统和环境,您可能需要将python3替换为py -3python或其他内容.

Import

您的file_2.py

import some_root
import some_root.dir_0
import some_root.dir_0.dir_1
from some_root.dir_0.dir_1 import file_1

file_1.foo()

但正如其他人在 comments 中所说的那样.改善文件和文件夹的 struct 并降低其复杂性.

Python相关问答推荐

使用FASTCGI在IIS上运行Django频道

时间序列分解

如何在Windows上用Python提取名称中带有逗号的文件?

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

log 1 p numpy的意外行为

使用setuptools pyproject.toml和自定义目录树构建PyPi包

在vscode上使用Python虚拟环境时((env))

如何在Pyplot表中舍入值

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

使用Python异步地持久跟踪用户输入

如果有2个或3个,则从pandas列中删除空格

当输入是字典时,`pandas. concat`如何工作?

在pandas中,如何在由两列加上一个值列组成的枢轴期间或之后可靠地设置多级列的索引顺序,

如何获取给定列中包含特定值的行号?

.awk文件可以使用子进程执行吗?

极点:在固定点扩展窗口

我怎样才能让深度测试在OpenGL中使用Python和PyGame呢?

将鼠标悬停在海运`pairplot`的批注/高亮显示上

搜索结果未显示.我的URL选项卡显示:http://127.0.0.1:8000/search?";,而不是这个:";http://127.0.0.1:8000/search?q=name";

是否从Python调用SHGetKnownFolderPath?