无论我尝试什么,自从我切换到 Python 3 后,我只能从项目的根文件夹运行导入的脚本,而不能从子文件夹导入。我知道这里有很多关于我收到的错误消息的问题,但建议的解决方案对我不起作用。有人可以为这个小示例项目提供示例解决方案吗?我相信它会受到很多人的赞赏。
proj\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foofolder\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 foofile.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 subfolder\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 run.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\nRun Code Online (Sandbox Code Playgroud)\n\nfoofun()我在 中定义了该函数foofile.py,并想在 中调用它run.py。
如果run.py直接在proj里面就可以了。但是(只是为了让事情井井有条)我想将其放在子文件夹中 - 令人惊讶的是,这似乎是不可能的。
烦人的是,我的 IDE (PyCharm) 中的自动完成功能表明from foofolder.foofile import foofun应该可以工作。但事实并非如此。我也无法想象任何其他进口:
from foofolder.foofile import foofun-->ImportError: No module named 'foofolder'
from .foofolder.foofile import foofun--> SystemError: Parent module '' not loaded, cannot perform relative import(与开头的两个点相同。)
from proj.foofolder.foofile import foofun-->ImportError: No module named 'proj'
即使是绝对导入也不起作用。为什么找不到proj?
sys.path是:['/parent/proj/subfolder', '/parent/env/lib/python35.zip', '/parent/env/lib/python3.5', '/parent/env/lib/python3.5/plat-x86_64-linux-gnu', '/parent/env/lib/python3.5/lib-dynload', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/parent/env/lib/python3.5/site-packages']
我在 virtualenv 中使用 Python 3.5.2。
\n\n编辑:当我建议这个问题特定于 Python 3 时,我错了。当我检查 Python 2.7.12 时,问题和解决方案是相同的。
\n\nPevogam 给出的解决方案有效。第一个字面意思只是添加'..'到,它描述了执行位置'sys.path'的父文件夹。run.py第二个明确添加了'/parent/proj'.
我寻找的解决方案是-m开关:
$ python -m proj.subfolder.run
Run Code Online (Sandbox Code Playgroud)
(注意点而不是斜线。)
当我能够避免像这样的并发症时,我总是很高兴sys.path.append。
另请参阅:-m 开关的用途是什么?
在 Django 项目中,我发现这也很有用:
$ python manage.py shell < app/utils/scripts/script.py
Run Code Online (Sandbox Code Playgroud)
在这里找到:如何从 Django shell 执行 Python 脚本?
| 归档时间: |
|
| 查看次数: |
3653 次 |
| 最近记录: |