如何运行从子文件夹导入的 Python 3 脚本?

Wat*_*uck 5 python-import sys

无论我尝试什么,自从我切换到 Python 3 后,我只能从项目的根文件夹运行导入的脚本,而不能从子文件夹导入。我知道这里有很多关于我收到的错误消息的问题,但建议的解决方案对我不起作用。有人可以为这个小示例项目提供示例解决方案吗?我相信它会受到很多人的赞赏。

\n\n
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\n
Run Code Online (Sandbox Code Playgroud)\n\n

foofun()我在 中定义了该函数foofile.py,并想在 中调用它run.py

\n\n

如果run.py直接在proj里面就可以了。但是(只是为了让事情井井有条)我想将其放在子文件夹中 - 令人惊讶的是,这似乎是不可能的。

\n\n

烦人的是,我的 IDE (PyCharm) 中的自动完成功能表明from foofolder.foofile import foofun应该可以工作。但事实并非如此。我也无法想象任何其他进口:

\n\n

from foofolder.foofile import foofun-->ImportError: No module named 'foofolder'

\n\n

from .foofolder.foofile import foofun--> SystemError: Parent module '' not loaded, cannot perform relative import(与开头的两个点相同。)

\n\n

from proj.foofolder.foofile import foofun-->ImportError: No module named 'proj'

\n\n

即使是绝对导入也不起作用。为什么找不到proj

\n\n

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']

\n\n

我在 virtualenv 中使用 Python 3.5.2。

\n\n
\n\n

编辑:当我建议这个问题特定于 Python 3 时,我错了。当我检查 Python 2.7.12 时,问题和解决方案是相同的。

\n\n

Pevogam 给出的解决方案有效。第一个字面意思只是添加'..'到,它描述了执行位置'sys.path'的父文件夹。run.py第二个明确添加了'/parent/proj'.

\n

Wat*_*uck 0

我寻找的解决方案是-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 脚本?