尽管有 __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
。
确保您的文件夹名称不是也是main
。 main.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 仍无法导入自定义模块的主要内容,如果未能解决你的问题,请参考以下文章