我需要通过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!