我需要通过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
具有相同的行为(来自文档):
请注意,如果匹配的字节编译文件匹配正确(后缀为.pyc 或.pyo)存在,它将被用来代替解析给定的源 文件。
将包含每个脚本的目录设为只读是我所知道的唯一解决方案(首先防止生成.pyc
文件)但我宁愿在可能的情况下避免使用它
(注意:使用python 2.7)
答案 0 :(得分:2)
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!
答案 1 :(得分:0)
如何使用包含python源的zip文件:
import sys
sys.path.insert("package.zip")
答案 2 :(得分:0)
您可以将包含.py文件的目录标记为只读。