Прочитать файл в Django Management Command - PullRequest
1 голос
/ 05 ноября 2019

Я пытаюсь прочитать учетные данные для API Google Sheets, используя gspread. Я написал следующий код:

class Command(BaseCommand):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def handle(self, *args, **kwargs):
        scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']

        credentials = ServiceAccountCredentials.from_json_keyfile_name('/static/json/spreadsheets.json', scope)

        gc = gspread.authorize(credentials)

        wks = gc.open("Where is the money Lebowski?").sheet1

        self.stdout.write(self.style.SUCCESS('Succesfully ran "sheets" command'))

При чтении файла возвращается следующая ошибка:

FileNotFoundError: [Errno 2] No such file or directory: 'static/json/spreadsheets.json'

Я пробовал несколько путей, например:

  • '~ /static / json / spreadsheets.json '
  • ' / json / spreadsheets.json '
  • ' spreadsheets.json '

Но, похоже, ничего не работает. Может ли кто-нибудь помочь мне здесь?

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Когда вы используете абсолютный путь, он берется буквально, т. Е. Начиная с корня файловой системы, т. Е. /.

Когда вы используете относительный путь, т. Е. Без / в начале, эторазрешается из каталога , где скрипт вызывается из , а не там, где скрипт фактически находится в файловой системе.

Поэтому, когда вы вызываете команду управления Django через, например, ./manage.py <command>, он ищетпуть, начиная с текущего каталога manage.py, то есть os.path.dirname('manage.py'). Если вы дадите путь как static/json/spreadsheets.json, полный путь, который он ищет:

os.path.join(
    os.path.abspath(os.path.dirname('manage.py')),
    '/static/json/spreadsheets.json'
)

Поэтому вам нужно убедиться, что у вас есть файл spreadsheets.json в правильном каталоге. Лучшим подходом было бы использовать абсолютный путь для таких сценариев. Если вы используете GNU / Linux, вы можете использовать:

readlink -f static/json/spreadsheets.json

, чтобы получить абсолютный путь.


Кроме того, вместо жесткого кодирования файла, вы должны взять файлв качестве аргумента для команды управления. Команда управления Django использует argparse для разбора аргументов, поэтому вы можете взглянуть на doc .

0 голосов
/ 05 ноября 2019

Прежде всего: ~ символ не должен работать в этом случае, потому что это просто глоб, который расширяется до полного пути с помощью * nix shell, поэтому в этом случае он не может быть раскрыт, так как оболочка не задействованаВот. Лидирующий символ / переместит вас в корневой каталог.

Я не знаю всех ситуаций (потому что вы не предоставили информацию о том, в каком каталоге вы запускаете эту команду и где находится файл для сравненияв этот каталог.

Но вы можете использовать метод getcwd из os библиотеки, например:

import os
print(os.getcwd())

Или из отладчика, чтобы узнать ваше текущее местоположение. Затем вы можете передатьабсолютный путь к файлу или используйте «..», чтобы при необходимости перейти в родительский каталог или даже изменить текущий рабочий каталог, используя метод os.chdir(), но это делать не рекомендуется, поскольку это может иметь некоторые побочные эффекты для Django или других библиотек, используемых впроект, который не ожидает, что каталог может быть изменен во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...