Как импортировать класс Python из модуля, расположенного в файловой директории с именем '@file_directory' или директории со специальными символами? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь импортировать класс из модуля с именем 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 голосов
/ 06 февраля 2019

Другая возможность: использовать встроенную функцию __import__() .Это, по сути, устраняет накладные расходы обычной команды 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")
0 голосов
/ 06 февраля 2019

Вы не можете импортировать модули с такими символами, как символ '@' ... однако использование execfile может быть подходящим обходным путем.

Протестировано с Python 2.7.5

my_classes.py пример кода:

def printMe():
    print "foo from my_classes"

пример кода main.py:

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

Выполнение распечатки main.py:

>>python main.py
foo from my_classes

main.py запустит файл my_classes.py , и теперь вы можете напрямую ссылаться на функции или любой соответствующий код из my_classes.py.

Эквивалент Python 3.X

У меня не установлен Python 3, но они удалили execfile. Альтернативой для execfile будет:

exec(open("./lib/@file_directory/my_classes.py").read())

Надеюсь, это поможет вам удовлетворить ваши потребности.

...