Импорт класса при работе с командной строкой
Пишу программу, которая работает с API. Принимает координаты и промежуток времени, затем записывает в файл погоду в этом промежутке времени по этим координатам. Необходимо реализовать интерфейс для работы с командной строкой. Вот код модуля работы с ней:
import click
from weather.table_creator.local_files.local_files import LocalFiles
@click.group()
def cli():
pass
@cli.command("stats")
@click.argument("lat")
@click.argument("lng")
@click.argument("start")
@click.argument("end")
def stats_cli(lat, lng, start, end):
ob1 = LocalFiles()
ob1.get_values(lat, lng, start, end)
ob1.transformation()
ob1.create_name()
ob1.record()
Проблема в том, что когда я запускаю модуль через терминал, мне пишет такую ошибку:
(venv) D:\Documents\weather>python weather\cli\cli.py stats 56.85 60.61 2018-07-16 2018-07-18
Traceback (most recent call last):
File "weather\cli\cli.py", line 3, in <module>
from weather.table_creator.local_files.local_files import LocalFiles
ModuleNotFoundError: No module named 'weather'
При том, если я просто исполняю файл, проблемы с поиском модуля нет. В других модулях программы импорт классов осуществлялся такой же строчкой, как в этом, и всё работало.
Файловая система моей программы:

Как видим, данный ненайденный модуль существует и чувствует себя хорошо. Строка вызова класса из другого модуля написана PyCharm'ом автоматически. Как исправить эту ошибку?
Код модуля local_fyles:
import copy
from weather.table_creator.api.api import API
class LocalFiles:
def __init__(self):
self.api = API()
def get_values(self, lat, lng, start, end):
response = self.api.send_request(lat, lng, start, end)
var = response.json()
hours = var['hours']
self.air_point = copy.deepcopy(hours)
self.hum_point = copy.deepcopy(hours)
self.time_point = copy.deepcopy(hours)
for i in range(0, len(hours)):
current_hour = hours[i]
air = current_hour['airTemperature']
hum = current_hour['humidity']
time = current_hour['time']
self.air_point[i] = air['noaa']
self.hum_point[i] = hum['noaa']
self.time_point[i] = time[:-9]
def transformation(self):
self.containing = 'дата/время;температура;влажность'
for i in range(0, len(self.air_point)):
self.containing = self.containing + f"\n{self.time_point[i]};{self.air_point[i]};{self.hum_point[i]}"
return self.containing
def create_name(self):
self.api.lat = str(self.api.lat)
self.api.lng = str(self.api.lng)
self.api.lat = self.api.lat.replace('.', '')
self.api.lng = self.api.lng.replace('.', '')
self.api.start = self.api.start.replace('-', '')
self.api.end = self.api.end.replace('-', '')
self.name_file = f'{self.api.lat} {self.api.lng} {self.api.start}-{self.api.end}'
return self.name_file
def record(self):
with open(f'{self.name_file}.csv', 'w') as f:
f.write(self.containing)
pass
return 'успех'
Код модуля api:
import requests
from weather.table_creator.api.constants import BASE_URL, AUTHORISATION
class API:
def __init__(self, url=BASE_URL, aut=AUTHORISATION):
self.url = url
self.aut = aut
def send_request(self, lat, lng, start, end):
self.params = {
'params': ','.join(['humidity', 'airTemperature']),
'lat': lat,
'lng': lng,
'start': f'{start} 00:00',
'end': f'{end} 00:00'
}
self.lat = lat
self.lng = lng
self.start = start
self.end = end
self.response = requests.get(self.url, params=self.params, headers=self.aut)
# json_data = self.response.json()
return self.response
Ответы (1 шт):
Для того, чтобы это работало.
К примеру для wether
Во все модули где пытаетесь импортировать wether до импорта whether
(впринципе достаточно добавить в модуль скрипта который запускаете, но кто знает как и откуда вы эти модули еще запускать будете)
import sys
sys.path.append(r'D:\\Documents\weather')
# ну тоесть путь к каталогу в котором находится weather.
# Поскольку в Вашем случае, как я понял из скриншота ваш модуль находится по пути
# D:\\Documents\weather\weather то берем D:\\Documents\weather
можно поупражняться с
os.path.dirname(os.path.dirname(__file__))но это уж сами
Для того, чтобы это корректно запустилось в PyCharm, для конфигурации через которую запускаете скрипт установите рабочим каталогом D:\\Documents\weather
