Python: 当前目录是否自动包含在路径中?

32 投票
2 回答
24296 浏览
提问于 2025-04-18 11:12

在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 个回答

1

我在用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
29

在Python中,当你运行一个脚本时,Python会把这个脚本所在的文件夹放在一个叫做 sys.path 的列表的最前面:

当程序启动时,这个列表的第一个项目 path[0] 就是包含你用来启动Python解释器的脚本的文件夹。如果这个脚本的文件夹不可用(比如你是直接在命令行中输入命令,或者脚本是从标准输入读取的),那么 path[0] 就会是一个空字符串,这样Python会先在当前目录中查找模块。需要注意的是,脚本所在的文件夹会被放在 PYTHONPATH 变量所指定的路径之前。

简单来说,Python会自动把你脚本所在的“本地”文件夹加到 sys.path 的最前面。

这意味着,当Python要找一个模块时,它会首先在脚本所在的文件夹中查找。

__init__.py 和这些内容没有直接关系。__init__.py 是用来把一个文件夹变成一个 (普通)包;任何在Python模块搜索路径中的这样的文件夹都会被当作一个模块来处理。

撰写回答