Запустить функцию Python с помощью Gspread из excel через xlwings

Я пытаюсь запустить функцию python с помощью Gspread из excel через xlwings. Что касается контекста, я делаю это, чтобы иметь возможность импортировать данные из базы данных листа Google в мой файл Excel в твердой копии. Функция отлично работает, когда я запускаю ее из консоли Python, но, похоже, не работает, когда я запускаю ее из Excel через макрос с помощью RunPython.

Точнее, я добавил флаги, чтобы увидеть, в чем проблема:

def main():

 wb = xw.Book.caller()
 wb.sheets['Dashboard'].range('J3').value=0#used as a flag

 import gspread
 from oauth2client.service_account import ServiceAccountCredentials
 wb.sheets['Dashboard'].range('J3').value=1.5#used as a flag
 # use creds to create a client to interact with the Google Drive API
 scope = ['https://spreadsheets.google.com/feeds']
 wb.sheets['Dashboard'].range('J3').value=1.6#used as a flag
 creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)
 wb.sheets['Dashboard'].range('J3').value=1.7#used as a flag
 client = gspread.authorize(creds)

 wb.sheets['Dashboard'].range('J3').value=1#used as a flag

Значение, которое я получаю в своей ячейке J3 после попытки запустить программу, равно 1,6, что означает, что строка, вызывающая проблему, следующая:

creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)

Файл client_secret.json находится в том же рабочем каталоге, что и скрипт python, и файл excel. Если у вас есть представление о том, в чем может быть проблема и как я могу ее решить, это было бы здорово!

Спасибо вам за помощь!


person Vincent    schedule 06.06.2017    source источник
comment
Рабочий каталог RunPython может отличаться, и вы пока не можете установить его из xlwings, поэтому вам нужно использовать полный путь для вашего json-файла.   -  person Felix Zumstein    schedule 06.06.2017
comment
Это действительно была проблема! Есть ли способ получить текущий рабочий каталог скрипта Python через RunPython ()? Это было бы удобно, если бы я хотел распространять свой код ...   -  person Vincent    schedule 07.06.2017
comment
вы должны иметь возможность использовать в своем скрипте что-то вроде os.path.join(os.path.dir(__file__), 'file_name').   -  person Felix Zumstein    schedule 07.06.2017
comment
Это работает с: os.path.dirname (os.path.abspath (file)) Большое спасибо!   -  person Vincent    schedule 07.06.2017


Ответы (1)


Как указано @Felix Zumstein, решение состоит в том, чтобы указать полный путь к json-файлу client_secret, возможно, используя os.path.dirname (os.path.abspath (file))

person Vincent    schedule 19.06.2018