【问题标题】:os.path.join with the import statement [duplicate]os.path.join 与 import 语句[重复]
【发布时间】:2019-11-30 22:25:40
【问题描述】:

我想尽可能简化语法和行数,所以我想知道为什么下面的语句是错误的:

from os.path.join(path1,path2,filename) import *

os.path.join 似乎不能与 import 语句一起运行。

有什么解决办法吗?

【问题讨论】:

  • 这不是 import 语句的工作方式。您需要导入该方法,然后运行它。在这种情况下,它可能看起来像 from os import path 然后 path.join(path1,path2,filename)
  • 错误是什么?我们需要知道这也有帮助。
  • Python 不从路径导入。它从模块名称导入。
  • 这个问题是有道理的,不应该被否决。

标签: python


【解决方案1】:

Python 的 import 语句需要一个“模块名称”,而不是文件路径才能工作。使用变量导入的方法是使用importlib.import_module 内置函数。 当然,您必须使用您的文件系统“路径”目录名称来打包名称,并且其中最顶部的部分必须在 PythonPath 中“可见”。 [:-3] 部分只是用来剥离 .py 部分,但您可以使用不带“.py”的模块名开始。

from importlib import import_module

module = importmodule('.'.join([path1, path2, filename[:-3]])
for attr in dir(module):
    globals()[attr] = getattr(module, attr)

但是,如您所见,您将使用您不知道它们的名称来填充名称空间,因此,您不能使用这些名称来编写程序代码——这使得它变得毫无意义。使用导入模块的属性简单地创建一个新字典可能更有用:

namespace = {}

for attr in dir(module):
    namespace[attr] = getattr(module, attr)

因此您可以反省导入的内容并调用/使用这些值。

现在,如果您的“path1”和“path2”不是一个包,并且您真的只想从任意位置导入模块,则需要将该位置插入 Pythonpath bedore 调用import_module .然而,Pythonpath 是一个位于 sys.path 的简单列表 - 只需在其中插入完整的文件夹路径(如果需要,稍后再弹出):


def import_path(path1, path2, module_name, namespace=None):
    import sys
    from importlib import import_module
    from pathlib import Path # new code should use this instead of "os.path" stuff
    path = Path(path1).joinpath(path2)
    name = module_name[-3:] if module_name.endswith(".py") else module_name
    try:
        sys.path.insert(0, str(path))
        module = import_module(name)
    finally:
        sys.path.remove(str(path))
    if namespace is None:
        namespace = sys._getframe().f_back.f_globals()
    for name in dir(module):
        namespace[name] = getattr(module, name)


(也可以直接使用__import__函数而不需要使用importlib.import_module,但文档中不建议使用它。除此之外,使用单参数形式__import__("path1.path2.module")将返回path1不是module。)

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 2016-07-12
    • 2019-08-09
    • 2016-08-12
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多