假设我在一个目录中有一个Python模块,在同一个目录中,我有一个以某种方式使用该模块的Python脚本
wdir
├── module
│ └── module_stuff
└── script.py
如果我在未安装模块的python环境中执行此文件,则在python从其源代码导入模块时,一切正常
问题是:如果我在这个Python环境中安装模块并继续以与以前相同的方式执行脚本,Python会从安装的模块还是从源代码导入模块?Python遵循什么样的hyerarchy来搜索每个导入?
为什么重要:如果我有一个脚本在执行过程中反复调用其他Python脚本并修改模块的源代码,那么会出现使用旧版本模块和新版本模块的结果,或者更糟糕的是,如果在模块代码中插入错误,可能会错过执行。但是,如果创建一个与测试环境分离的开发环境,这个问题就会得到解决
实际上,您可以自己尝试: 让我们构建并安装一个模块,然后对其进行修改,以查看谁更喜欢:
mymod | setup.py | mymod | myfun.py | __init__.py
setup.py包含:
myfun.py包含:
现在我们制作一个virtualenv并安装它:
现在我们转到python并导入
现在我们修改myfun.py而不安装它:
我们回到python:
所以看起来目录优先于模块,但是试试看
(注意,如果我们切换到一个目录,其中mymod.myfun不直接在我们的路径中,它将返回到打印原始mod)
这似乎取决于
sys.path
引用https://docs.python.org/3/tutorial/modules.html#the-module-search-path:
接着说
这对我来说意味着理论上任何事情都可能发生:-/
我猜
module_stuff
与内置名不相同,因此排除了第一个您可能知道,Python不会在一次运行中两次导入同一个模块。也许您可以通过对
module/module_stuff
做一个小更改并再次运行来测试它相关问题 更多 >
编程相关推荐