如何从位于名为“ @file_directory”的文件目录或具有特殊字符的目录中的模块中导入python类?

时间:2019-02-06 19:49:42

标签: python python-3.x python-import

我正在尝试从名为my_classes.py的模块中导入一个类。问题是,它位于名为 @file_directory 的目录中。

结构是这样,我在项目目录的顶部有main.py,并且在同一级别还有一个名为 lib 的目录。在“ lib”中,有一个名为“ @file_directory”的子目录,在其中有一个模块“ my_classes”,如下所示。

-> main.py
-> /lib
   -> lib_other_files.py
   -> /@file_directory
      -> my_classes.py

我通常能做的是

from lib.@file_directory.myclasses import cust_class

但是因为@符号是包装符号,所以它阻止了我从'@file_directory'导入文件。当然,简单的选择就是更改目录名称,但是我想保留文件名/没有权限在项目中更改它。有没有办法像escpae字符那样从具有特殊字符的目录中导入模块?

2 个答案:

答案 0 :(得分:1)

另一种可能性:use the __import__() built-in function。从本质上讲,这消除了常规import命令的开销,但由于它只需要将字符串作为参数,并且可以转义否则无效的字符,因此可以为包命名提供更大的灵活性。

因此,此代码应该起作用:

_temp = __import__("lib.@file_directory.myclasses", globals(), locals(), ['cust_class'], 0)
cust_class = _temp.cust_class

编辑:python标准库建议改为使用importlib。相同的代码如下所示:

import importlib
cust_class = importlib.import_module("lib.@file_directory.myclasses", "cust_class")

答案 1 :(得分:0)

您不能导入带有'@'符号之类的字符的模块...但是,使用execfile可能是适合您的解决方法。

经过Python 2.7.5测试

my_classes.py示例代码:

localhost:8761

main.py示例代码:

def printMe():
    print "foo from my_classes"

执行main.py会输出:

execfile("./lib/@file_directory/my_classes.py")
printMe()

发生的事情是 main.py 将运行 my_classes.py 文件,现在您可以直接引用my_classes.py中的函数或任何相关代码。

等效于Python 3.X

我没有安装python 3,但是他们确实删除了execfile。.execfile的替代方法是:

>>python main.py
foo from my_classes

希望这可以帮助您满足需求。