импорт класса модуля из другого пути в python: «Ошибка имени: имя ‘enpy’ не определено»

#python #python-3.x #object #pip

#python #python-3.x #объект #pip

Вопрос:

У меня есть exmple.py скрипт, который пытается создать объект из модуля, который находится в __main__.py другом каталоге, как показано здесь:

 ├─ /enpy
│  ├─ __init__.py
│  └─ __main__.py
│
└─/tests
   ├─ /filetest
   │  └─ train.json
   │
   └─ example.py
 

main.py имеет один класс под названием Enpy, и он начинается так и имеет множество различных функций:

MAIN.PY

 # Dependancies
import json
import csv

class Enpy:
    # Global Variables
    dataset = None

    # initialize class
    def __init__(self, file):
        self.readDataset(file)
    
    # Functions
    def readDataset(self, file):
        with open(file) as f:
            self.dataset = json.load(f)
 

Тогда я не уверен, импортируйте библиотеку enpy и используйте класс в main.py . Итак, на данный момент в example.py У меня есть

EXAMPLE.PY

 import sys
sys.path.insert(1, '../enpy')

from enpy import *

# TESTING 

# 1. Creating Enpy Object
enpyObj = enpy.Enpy('./filetest/train.json')
 

Я получаю сообщение об ошибке при попытке запустить мой example.py где я импортирую свою локальную библиотеку в папку ./enpy

enpyObj = enpy.Enpy(‘./filetest/train.json’)

Ошибка имени: имя ‘enpy’ не определено

Я знаю, что есть много вопросов по этому поводу, но не очень понятно, как импортировать классы. Спасибо!

Комментарии:

1. Используется importlib.resources для чтения файлов данных (в вашем случае файла Json). Нет необходимости в sys.path модификациях. Вызовите свой код из каталога, содержащего ваш пакет верхнего уровня ( enpy ): python tests/example.py .

Ответ №1:

Вы можете импортировать enpy , используя абсолютный путь. Таким образом, вы можете использовать SourceFileLoader для импорта из абсолютного пути:

 from importlib.machinery import SourceFileLoader

enpy = SourceFileLoader("module.name", "/path/to/enpy/__init__.py").load_module()
enpyObj = enpy.Enpy('./filetest/train.json')
 

Комментарии:

1. Это не сработало, в том числе потому, что оно отсутствует load_module(fullname="enpy") . Я обнаружил, что, работая example.py в главном каталоге, переименуйте __main__.py , например Enpy.py , в, а затем измените на from enpy import Enpy и enpyObj = Enpy.Enpy('./tests/filetest/train.json') , а также все мои другие пути: работает.