我正在尝试从名为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字符那样从具有特殊字符的目录中导入模块?
答案 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
希望这可以帮助您满足需求。