【问题标题】:In python, what code should I generate to do "from FILE import *"?在 python 中,我应该生成什么代码来执行“from FILE import *”?
【发布时间】:2022-01-04 04:44:05
【问题描述】:

我正在开发pythonizer,这是一个将 perl 翻译成 python 的程序,我正在寻找翻译语句“require FILENAME;”到蟒蛇。在这种情况下,我需要生成“from FILENAME import *”。我想出了“来自文件名”部分(这里 BASENAMEFILENAME 没有路径或扩展名):

from importlib.machinery import SourceFileLoader
module = SourceFileLoader(BASENAME, FILENAME).load_module()

import * 部分编码为:

__import__(name, fromlist=['*'])

但是我该如何组合它们呢?

我在importlib._bootstrap 中看到了_handle_fromlist,但在这里调用内部例程很可能不是正确的答案。

【问题讨论】:

  • 顺便说一句,您应该希望意识到from something import * 通常是一个壮观的坏主意:-)
  • 我当然知道——我只是想翻译 perl 代码的语义。
  • 没有问题,snoopyjc,只是确保引起大家的注意 :-)
  • 您正在生成代码。为from FILE import * 生成的代码是from FILE import *。为什么会是别的?
  • from 不采用文件名 - 它需要一个模块名称作为 FILE

标签: python python-import


【解决方案1】:

这是我实现这个的第二个想法:

[_p, _m] = _prep_import(FILENAME)
sys.path.insert(0, _p)
__import__(_m, fromlist=['*'])
sys.path.pop(0)

def _prep_import(filepath):
    """Prepare a filepath for import by getting the abspath, splitting
    it from the filename, and removing any extension.  Returns a tuple of
    the path and the filename"""
    return os.path.split(os.path.splitext(os.path.abspath(filepath))[0])

_prep_import() 在哪里查看文件名(可能是一个表达式),删除任何扩展名,从中获取任何路径信息到第一个结果中,并将基本名称作为第二个结果。请注意,FILENAME 可能包含破折号 (-),我相信 __import__ 可以。

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多