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

时间:2011-12-07 20:04:15

标签: python

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

3 个答案:

答案 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文件的目录标记为只读。