尽管有 __init__.py,Python 仍无法导入自定义模块

Posted

技术标签:

【中文标题】尽管有 __init__.py,Python 仍无法导入自定义模块【英文标题】:Python unable to import custom module despite having __init__.py 【发布时间】:2012-02-24 11:31:08 【问题描述】:

我有一个带有__init__.py 的文件夹

文件__init__.py:

#!/usr/bin/python2
flags="test"

文件 main.py:

#!/usr/bin/python2
import foldername

def main():
    print foldername.flags

if __name__ == '__main__':
main()

现在,当我运行 ./main.py(从文件夹内部)时,我得到了错误

ImportError: No module named foldername

【问题讨论】:

确保foldername的父目录在你的python路径中(环境变量PYTHONPATH)。 你不能使用flags - 它应该是foldername.flags 确保您的文件夹名称不是也是mainmain.py 应该在同一个文件夹中。 @Anony-Mousse: main.py 可能在同一个文件夹中。 Python 2.7 甚至使用__main__.py 名称明确支持它。 【参考方案1】:

foldername文件夹运行:

    $ python -m foldername.main

如果您将 main.py 重命名为 __main__.py,那么您可以将其运行为(从 Python 2.7 开始):

    $ python -m foldername

python -m 将当前目录隐式添加到您的 python 路径 (sys.path)。

Parent Folder/
└── foldername
    ├── __init__.py
    │   #    flags="test"
    └── __main__.py
        #    import foldername
        #   
        #    def main():
        #        print foldername.flags
        #   
        #    if __name__=="__main__":
        #        main()

如果foldername 的父目录在您的python 路径中,那么您可以从任何 目录运行上述命令。

【讨论】:

从 main 的父文件夹运行会给出:/usr/bin/python2: No module named foldername @jck:上移一个目录,即使用 folder "foldername" 的父文件夹。 对不起。从主目录(文件夹名称的父文件夹)运行也会产生相同的错误。 @jck:我已经添加了目录布局。应该清楚“父文件夹”是什么。【参考方案2】:

PYTHONPATH 问题。确保“文件夹名”在您的路径中可用。如果您从“文件夹名”内部运行它,它可能不可用。尝试从“文件夹名”的父级运行。

这里是a question about finding your PYTHONPATH。

【讨论】:

这不是PYTHONPATH 的问题。这是 python 路径问题 (sys.path)。我的 PYTHONPATH 环境变量始终为空。 python 将脚本的目录隐式添加到 sys.path。有时它被称为sys.path[0] 脚本初始化。 哇,这解决了我的神秘问题!我没有意识到父路径也必须在 PYTHONPATH 中!因此,位于我要导入的级别之上的相同脚本运行良好。但是一旦我将它移动到某个子目录中,即使使用正确的 sys.path 它也不会导入 - 直到我将父目录添加到 sys.path 。谢谢!【参考方案3】:

确保你的布局是这样的:

./folder/__init__.py
./main.py

并且没有名为folder.py的文件

更改到 parent 文件夹,以便 ls folder/__init__.py 工作。

接下来尝试运行python -c "import folder"

【讨论】:

【参考方案4】:

如果你想在 python3 中导入 a 模块,只需转到根文件夹

python3 -mModuleName

确保不要删除模块名称前的-m,然后您可以在项目目录中的任何位置导入此模块。

【讨论】:

以上是关于尽管有 __init__.py,Python 仍无法导入自定义模块的主要内容,如果未能解决你的问题,请参考以下文章

python2中的__init__.py文件的作用

python基础:__init__.py和__init__函数的作用

python包中__init__.py的作用

Python无法在同一文件夹中找到模块

python 目录下的__init__.py

你经常看到却经常忽视的__init__.py有什么用?