Python: 当前目录是否自动包含在路径中?
在Python 3.4中,从一些其他的StackOverflow问题来看,如果你的moduleName.py
文件不在当前目录下,想要导入它的话,就得先把它的路径加到系统路径里,方法是用sys.path.insert(0, '/path/to/application/app/folder')
。否则,如果你直接写import moduleName
,就会出现错误:
ImportError: No module named moduleName
这是不是意味着Python会自动把同一目录下的所有.py文件都加到路径里呢?在背后发生了什么,让你可以不加路径就导入本地文件?还有,__init__.py
文件在背后又是干什么的呢?
2 个回答
我在用Intellij Idea运行Python脚本时也遇到了同样的问题。
C:\Users\user\IdeaProjects\Meshtastic-python\meshtastic
这个脚本用到了
from meshtastic import portnums_pb2, channel_pb2, config_pb2
但是运行失败了。
我发现它在寻找
C:\Users\user\IdeaProjects\Meshtastic-python\meshtastic\meshtastic
于是我在运行配置中把这个脚本的工作目录从
C:\Users\user\IdeaProjects\Meshtastic-python\meshtastic
改成了
C:\Users\user\IdeaProjects\Meshtastic-python
这样在执行时,它就能在工作目录下面找到这个模块了。
C:\Users\user\IdeaProjects\Meshtastic-python\meshtastic
在Python中,当你运行一个脚本时,Python会把这个脚本所在的文件夹放在一个叫做 sys.path
的列表的最前面:
当程序启动时,这个列表的第一个项目
path[0]
就是包含你用来启动Python解释器的脚本的文件夹。如果这个脚本的文件夹不可用(比如你是直接在命令行中输入命令,或者脚本是从标准输入读取的),那么path[0]
就会是一个空字符串,这样Python会先在当前目录中查找模块。需要注意的是,脚本所在的文件夹会被放在PYTHONPATH
变量所指定的路径之前。
简单来说,Python会自动把你脚本所在的“本地”文件夹加到 sys.path
的最前面。
这意味着,当Python要找一个模块时,它会首先在脚本所在的文件夹中查找。
__init__.py
和这些内容没有直接关系。__init__.py
是用来把一个文件夹变成一个 (普通)包;任何在Python模块搜索路径中的这样的文件夹都会被当作一个模块来处理。