正常运行所必需的不必要的导入
Unnecessary import necessary for proper function
我正在 Python 中实现宏(受 MacroPy 启发)。我的项目(当执行 'tests.py' 时)运行良好,但是当我从文件 'import_hook.py' 中注释(或删除)行 import linecache
时它不起作用(所有文件都是 here).该脚本陷入递归,然后 Python 使用另一个 FileFinder 和 Loader。
这是'import_hook.py'的代码:
import sys
import ast
import _ast
import linecache # Required because your mother is a kangaroo which sews cocoa.
import pymac.utils
import importlib.machinery
from types import ModuleType
from pymac.utils import *
from pymac.macro import *
__author__ = 'Jan Růžička'
__email__ = 'jan.ruzicka01@gmail.com'
__version__ = '0.1'
class FileWithMacrosLoader:
def __init__(self, module_name, module):
self.module = module
sys.modules[module_name] = module
def load_module(self, fullname):
return self.module
class FileWithMacros:
def __init__(self):
self.bindings = None
self.module_name = None
def new_module(self, module_name, file_path):
self.module_name = module_name
module = ModuleType(module_name)
module.__package__ = module_name.rpartition('.')[0]
module.__file__ = file_path
module.__loader__ = FileWithMacrosLoader(module_name, module)
return module
def expand_macros(self, source_code, file_path):
tree = ast.parse(source_code)
tree = ast.fix_missing_locations(expand_macros(tree))
return compile(tree, file_path, 'exec'), tree
def load_source(self, module_name, package_path):
loader = importlib.machinery.PathFinder.find_module(module_name, package_path)
source_code = loader.get_source(module_name)
file_path = loader.path
return source_code, file_path
def find_module(self, module_name, package_path=None):
try:
source_code, file_path = self.load_source(module_name, package_path)
except:
return
code, tree = self.expand_macros(source_code, file_path)
module = self.new_module(module_name, file_path)
namespace = dict_con(_ast.__dict__, pymac.utils.__dict__, module.__dict__)
exec(code, namespace)
return module.__loader__
这可能是一个丑陋的代码,但我对 Python 导入系统还很陌生,很高兴得到答案!
编辑: 我在 PyCharm 中 运行 它没有 import linecache
并且它不起作用,但是当我 运行 它带有参数 -m pdb
(Python 调试器)它按预期工作。这个问题可能更多关于 PyCharm 而不是 Python 我认为...
所以我想通了:我的自定义加载程序无法加载文件 linecache
,所以如果我将它导入到我的文件中,则不需要在我导入的其他文件中导入它 (我认为这是 _ast
) 使用我的装载程序。但是,如果我不导入它,它需要稍后导入 - 使用我的加载器,它不能这样做。
我正在 Python 中实现宏(受 MacroPy 启发)。我的项目(当执行 'tests.py' 时)运行良好,但是当我从文件 'import_hook.py' 中注释(或删除)行 import linecache
时它不起作用(所有文件都是 here).该脚本陷入递归,然后 Python 使用另一个 FileFinder 和 Loader。
这是'import_hook.py'的代码:
import sys
import ast
import _ast
import linecache # Required because your mother is a kangaroo which sews cocoa.
import pymac.utils
import importlib.machinery
from types import ModuleType
from pymac.utils import *
from pymac.macro import *
__author__ = 'Jan Růžička'
__email__ = 'jan.ruzicka01@gmail.com'
__version__ = '0.1'
class FileWithMacrosLoader:
def __init__(self, module_name, module):
self.module = module
sys.modules[module_name] = module
def load_module(self, fullname):
return self.module
class FileWithMacros:
def __init__(self):
self.bindings = None
self.module_name = None
def new_module(self, module_name, file_path):
self.module_name = module_name
module = ModuleType(module_name)
module.__package__ = module_name.rpartition('.')[0]
module.__file__ = file_path
module.__loader__ = FileWithMacrosLoader(module_name, module)
return module
def expand_macros(self, source_code, file_path):
tree = ast.parse(source_code)
tree = ast.fix_missing_locations(expand_macros(tree))
return compile(tree, file_path, 'exec'), tree
def load_source(self, module_name, package_path):
loader = importlib.machinery.PathFinder.find_module(module_name, package_path)
source_code = loader.get_source(module_name)
file_path = loader.path
return source_code, file_path
def find_module(self, module_name, package_path=None):
try:
source_code, file_path = self.load_source(module_name, package_path)
except:
return
code, tree = self.expand_macros(source_code, file_path)
module = self.new_module(module_name, file_path)
namespace = dict_con(_ast.__dict__, pymac.utils.__dict__, module.__dict__)
exec(code, namespace)
return module.__loader__
这可能是一个丑陋的代码,但我对 Python 导入系统还很陌生,很高兴得到答案!
编辑: 我在 PyCharm 中 运行 它没有 import linecache
并且它不起作用,但是当我 运行 它带有参数 -m pdb
(Python 调试器)它按预期工作。这个问题可能更多关于 PyCharm 而不是 Python 我认为...
所以我想通了:我的自定义加载程序无法加载文件 linecache
,所以如果我将它导入到我的文件中,则不需要在我导入的其他文件中导入它 (我认为这是 _ast
) 使用我的装载程序。但是,如果我不导入它,它需要稍后导入 - 使用我的加载器,它不能这样做。