修复此importError错误的正确方法是什么?
我有以下目录结构:
1 2 3 4 5
| /home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo |
我在目录里
1
| /home/bodacydo/work/project |
现在如果我打字
1
| python ./programs/my_python_program.py |
我立刻得到
1
| ImportError: No module named foo.tasks |
./programs/my_python_program.py包含以下行:
1
| from foo.tasks import my_function |
我不明白为什么python找不到./foo/tasks.py——它就在那里。
如果我从python shell执行此操作,那么它会工作:
1 2
| python
>>> from foo.tasks import my_function |
只有当我通过python ./programs/my_python_program.py脚本调用它时,它才不起作用。
python不会将当前目录添加到sys.path中,而是添加脚本所在的目录。将/home/bodacydo/work/project加到sys.path或$PYTHONPATH中。
- 那么在根文件夹中使用init.py有什么意义呢?如果编辑sys.path或pythonpath,似乎没有任何作用。
- @编者:__init__.py只表示当目录的父目录在sys.path中或它本身是一个包时,该目录应被视为一个包。
- 此外,请检查文件夹的权限。这就是我的问题所在。
- 两个都试过了,但仍然不起作用,我在MacosSierra(10.12)上使用的是python 2.7。
- 要将当前目录添加到python路径,请使用export PYTHONPATH=`pwd`。
- 对我有用的是在$pythonpath中添加项目的父目录,在您的例子中是:/home/bodacydo/work…看到这个答案
在foo目录中有一个名为__init__.py的文件吗?如果没有,那么python就不会将foo识别为python包。
有关更多信息,请参阅Python教程中有关包的部分。
- 谢谢,是的,我有一本书。这次问题出在$PYTHONPATH上。伊格纳西奥的解决方案奏效了。
- 需要init.py文件才能使python将目录视为包含包;这样做是为了防止具有公共名称(如string)的目录无意中隐藏稍后在模块搜索路径上出现的有效模块。在最简单的情况下,init.py只能是一个空文件
- 谢谢你有空救我。
将库添加到您的pythonpath的示例解决方案。
在~/.bashrc中添加以下行或直接运行它:
1
| export PYTHONPATH="$PYTHONPATH:$HOME/.python" |
然后将所需的库链接到~/.python文件夹中,例如
1
| ln -s /home/user/work/project/foo ~/.python/ |
下面是一个逐步解决方案:
在/home/bodacydo/work/project中添加一个名为run.py的脚本,然后按如下方式编辑:
1 2
| import programs.my_python_program
programs.my_python_program.main() |
(用你在my_python_program中的等效方法替换main()。)
去/home/bodacydo/work/project。
运行run.py。
说明:由于python将运行脚本的路径追加到pythonpath,因此运行run.py将追加/home/bodacydo/work/project。好的,会找到import foo.tasks。
比设置PYTHONPATH更好的方法是使用python -m module.path。
这将正确设置sys.path[0],是一种更可靠的执行模块的方法。
关于这个问题,我有一个简短的描述,正如其他回答者所提到的,原因是python path/to/file.py把path/to放在PYTHONPATH的开头(sys.path)。
在我看来,foo文件夹是一个独立的库。我可能会考虑将它移到Python安装中的Lib\site-packages文件夹中。我可能想考虑在那里添加一个foo.pth文件。
我知道这是一个图书馆,因为./programs/my_python_program.py包含以下行:
from foo.tasks import my_function
因此,./programs是./foo的兄弟文件夹并不重要。事实上,my_python_program.py是以这样的脚本运行的:
python ./programs/my_python_program.py