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 语句[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Python join() 方法与os.path.join()的区别
Python基本知识 os.path.join与split() 函数
Python | os.path.join() method
os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)) 是啥意思? Python