【问题标题】:Python Import using __init__.py instead of adding to sys.pathPython 使用 __init__.py 导入而不是添加到 sys.path
【发布时间】:2026-01-01 13:25:02
【问题描述】:

这是我的文件结构。

/working dir
    __init__.py
    main.py
    /packages
        __init__.py
        snafu.py
        /subfolder1
            __init__.py
            foo.py
        /subfolder2
            __init__.py
            bar.py
        /many_more
            ...

如果我运行main.py,它将尝试导入from subfolder1.foo import something 但是foo.py 会尝试import subfolder2,因为subfolder2 没有找到,所以这不起作用。

进入每个文件并将每个导入语句都更改为from packages.a_subfolder.whatever import something 的工作量太大了

我已经通过将/packages 添加到sys.path 来使其工作,但我不想这样做。有没有办法使用__init__.py 文件来解决这个问题?

import * 添加到 /packages __init__.py 文件是否有效?

many_more/ 文件夹是我下载的第三方包,因为我在不同的计算机上工作,而不是在我工作的每台计算机上安装包,只使用文件夹中的一个。 例如:要在您的程序中使用 googledrive,您需要大约 10 个不同的软件包才能使其工作。

【问题讨论】:

  • @jonrsharpe 这会起作用,但是我需要将它添加到大约 50 个导入语句中。我需要将它添加到所有 foo.py 和 bar.py 导入语句以及所有其他包中的所有内容中。
  • 那么为什么他们一开始就这样写呢?您最近是否重新安排/重组了您的包裹(哇!)?
  • 我没有写大部分我只是在使用它们,我更新了问题以解释更多。
  • 谁写的?它们是否应该一起使用,如果可以,为什么不将它们放在一个包中?

标签: python


【解决方案1】:

在您的情况下,您似乎想要导入父目录中存在的模块。 在要从中导入父目录中的模块的文件中包含以下代码应该可以:

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

【讨论】:

  • OP 正在询问如何使用 init 文件进行操作
【解决方案2】:

所以看起来唯一可行的方法是添加

import sys, os
packagepath = os.getcwd() + '/packages'
sys.path.append(packagepath)

到 /packages __init__.py 文件并使用 from packages.subfolder1.foo import something

【讨论】: