Bonjour,
Je suis nouveau en programmation Python, et je rencontre le problème suivant :
Traceback (most recent call last):
File "/home/bernard/quickstart/quickinsert.py", line 75, in
event = service.events().insert(calendarId='primary', body=event).execute()
NameError: name 'service' is not defined
Ce nom semble pourtant définit.
Merci d'avance pour votre aide
Bernard
Mon code : (issu d'exemple sur le web)
from __future__ import print_function
import datetime
import pickle
import os.path
import sys
reload(sys)
sys.setdefaultencoding('utf8')
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
# SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']
SCOPES = ['https://www.googleapis.com/auth/calendar']
def main():
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server()
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('calendar', 'v3', credentials=creds)
# Call the Calendar API
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
events_result = service.events().list(calendarId='primary', timeMin=now,
maxResults=200, singleEvents=True,
orderBy='startTime').execute()
events = events_result.get('items', [])
event = {
'summary': 'Google I/O 2015',
'location': '800 Howard St., San Francisco, CA 94103',
'description': 'A chance to hear more about Google\'s developer products.',
'start': {
'dateTime': '2015-05-28T09:00:00-07:00',
'timeZone': 'America/Los_Angeles',
},
'end': {
'dateTime': '2015-05-28T17:00:00-07:00',
'timeZone': 'America/Los_Angeles',
},
'recurrence': [
'RRULE:FREQ=DAILY;COUNT=2'
],
'attendees': [
{'email': 'lpage@example.com'},
{'email': 'sbrin@example.com'},
],
'reminders': {
'useDefault': False,
'overrides': [
{'method': 'email', 'minutes': 24 * 60},
{'method': 'popup', 'minutes': 10},
],
},
}
event = service.events().insert(calendarId='primary', body=event).execute()
if __name__ == '__main__':
main()
# balise
Posté par gaaaaaAab . Évalué à 4.
pour mettre du code, tu devrais utiliser le formattage (cf aide mémoire en dessous de la fenêtre de rédaction). Là, il faut ouvrir le bloc de code avec ```python et le fermer avec ```. En l'état, c'est illisible
```
# indentation
Posté par ted (site web personnel) . Évalué à 1.
Pas facile de s'y retrouver avec cette mise en forme…
Est ce que tu as bien mis une indentation à la ligne 75? Car sinon, la ligne ne fait pas partie de la fonction main(), et donc l'objet "service" n'existe effectivement pas à cet instant (il n'existe que dans main() ).
Un LUG en Lorraine : https://enunclic-cappel.fr
[^] # Re: indentation
Posté par NeoX . Évalué à 2.
j'ai edité son post pour y mettre les bonnes balises,
j'espere que les indentations sont bien restées
[^] # Re: indentation
Posté par lolop (site web personnel) . Évalué à 3.
Q? Quelle version de Python (si pas de contrainte, dégager Python2) ?
Si l'indentation est correcte, le
Qui est tout à la fin, est dans l'espace de noms du module et est exécuté avant l'appel à
main()
. Comme c'est avant l'appel, service qui est créé par main() n'existe pas encore. Et comme c'est défini hors de la fonction, la variable locale n'est de toute façon pas visible (et n'existe plus après le retour de la fonction).Q? pourquoi
reload(sys)
etsys.setdefaultencoding('utf8')
? S'il y a des décodages à faire à certains moments, c'est nettement mieux de les faire explicitement là où on en a besoin plutôt que de jouer avec un aspect auto-magique (pour les sources il y a la directive en début de fichier, et en Python c'est utf8 par défaut). Et passer à Python 3 permet d'avoir une bonne séparation entre des tableaux d'octets et des chaînes de caractères — c'est un des gros apports du changement majeur de version.Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.