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

Joh*_*nut 5 python python-import python-3.x

我正在尝试从名为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
Run Code Online (Sandbox Code Playgroud)

我通常能做的是

from lib.@file_directory.myclasses import cust_class
Run Code Online (Sandbox Code Playgroud)

但是因为该@符号是一个包装符号,所以它阻止我从“@file_directory”导入文件。简单的灵魂当然是,只需更改目录名称,但我想保留文件名/无权在项目中更改它。有没有办法像 escpae 字符一样使用从具有特殊字符的目录中导入模块?

Ben*_*iss 0

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

使用 Python 2.7.5 进行测试

my_classes.py 示例代码:

def printMe():
    print "foo from my_classes"
Run Code Online (Sandbox Code Playgroud)

main.py 示例代码:

execfile("./lib/@file_directory/my_classes.py")
printMe()
Run Code Online (Sandbox Code Playgroud)

执行 main.py 打印出:

>>python main.py
foo from my_classes
Run Code Online (Sandbox Code Playgroud)

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

Python 3.X 等效项

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

exec(open("./lib/@file_directory/my_classes.py").read())
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助您实现您的需求。