从文件路径动态加载模块时强制python忽略pyc文件

我需要通过filepath导入
python模块(例如,“/some/path/to/module.py”),只在运行时知道并忽略任何.pyc文件.

这个previous question建议使用imp.load_module作为解决方案,但这种方法似乎也使用.pyc版本(如果存在).

importme.py

SOME_SETTING = 4

main.py:

import imp
if __name__ == '__main__':
    name = 'importme'
    openfile, pathname, description = imp.find_module(name)
    module = imp.load_module(name, openfile, pathname, description)
    openfile.close()
    print module

执行两次,首次调用后使用.pyc文件:

$python main.py 
<module 'importme' from '/Users/dbryant/temp/pyc/importme.py'>

$python main.py 
<module 'importme' from '/Users/dbryant/temp/pyc/importme.pyc'>

不幸的是,imp.load_source具有相同的行为(来自文档):

Note that if a properly matching byte-compiled file (with suffix .pyc
or .pyo) exists, it will be used instead of parsing the given source
file.

让每个包含脚本的目录都是只读的是我所知道的唯一解决方案(首先防止生成.pyc文件),但如果可能的话我宁愿避免使用它.

(注意:使用python 2.7)

最佳答案 load_source对我来说是正确的,即

dir, name = os.path.split(path)
mod = imp.load_source(name, path)

即使pyc文件可用,也使用.py变体 – 名称以python3下的.py结尾.显而易见的解决方案显然是在加载文件之前删除所有.pyc文件 – 如果你运行多个程序实例,竞争条件可能会有问题.

另一种可能性:Iirc你可以让python从内存中解释文件 – 即用普通文件API加载文件,然后编译内存中的变种.就像是:

path = "some Filepath.py"
with open(path, "r", encoding="utf-8") as file:
    data = file.read()
exec(compile(data, "<string>", "exec")) # fair use of exec, that's a first!
点赞