zshuangyan / blog

我的个人博客
2 stars 0 forks source link

Python常见问题(一): ImportError #20

Open zshuangyan opened 5 years ago

zshuangyan commented 5 years ago
  1. 执行不在项目根目录下的脚本报错: 引用自stackoverflow上的一个例子
    
    I have the following directory structure:

/home/bodacydo /home/bodacydo/work /home/bodacydo/work/project /home/bodacydo/work/project/programs /home/bodacydo/work/project/foo And I am in the directory

/home/bodacydo/work/project Now if I type

python ./programs/my_python_program.py I instantly get

ImportError: No module named foo.tasks The ./programs/my_python_program.py contains the following line:

from foo.tasks import my_function I can't understand why python won't find ./foo/tasks.py - it's there.

If I do it from the Python shell, then it works:

python

from foo.tasks import my_function It only doesn't work if I call it via python ./programs/my_python_program.py script

这个问题的导致原因是:如果直接使用运行python ./programs/my_python_program.py的话,编译器会在脚本所在的目录查找包,那么就看不到当前目录外边的包,因此就会有导入错误

有三种解决方法:

  1. 编辑my_python_program.py, 在from foo.tasks import my_function前添加下面的代码:
    
    import sys
    import os.path

sys.path.append(os.path.join(os.path.dirname(file), '..'))


2. 在项目根目录下,即/home/bodacydo/work/project目录下,创建一个脚本run.py,在里边导入programs.my_python_program,执行目标函数

import programs.my_python_program programs.my_python_program.main()

然后在项目根目录下执行run.py

3. 使用-m的方式执行my_python_program.py

python -m programs.my_python_program