os.path.join 与 import 语句[重复]

Posted

技术标签:

【中文标题】os.path.join 与 import 语句[重复]【英文标题】:os.path.join with the import statement [duplicate] 【发布时间】: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 不从路径导入。它从模块名称导入。 这个问题是有道理的,不应该被否决。 【参考方案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。)

【讨论】:

以上是关于os.path.join 与 import 语句[重复]的主要内容,如果未能解决你的问题,请参考以下文章

os.path.join 与 str 子类

Python join() 方法与os.path.join()的区别

Python基本知识 os.path.join与split() 函数

Python | os.path.join() method

python的os.path.join()

os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)) 是啥意思? Python