8797 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Depuis Juin, et jusqu'à la rentrée, je me lance dans Python pour explorer ensuite l'Open AI API.
Donc là je démarre avec l'API..
Il faut une clé, ça j'ai compris, je l'ai créée et tous les exemples recommandent de la cacher dans les variables d'environnement pour la protéger, j'ai donc ce code en exemple:


import os
import openai
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

# Securely retrieve API key from environment
openai.api_key = os.getenv("OPENAI_API_KEY")

# Verify key is loaded
if not openai.api_key:
    raise ValueError("OpenAI API key not found in environment variables!")


Donc ma question, c'est:
- à quel moment je communique à Python la valeur de ma clé d'API et comment je fais ça?

j'ai cherché un peu partout et je ne trouve pas...
J'ai trouvé une piste:
- il faut installer python-dotenv
- il faut créer un fichier .env (que j'ai mis au même niveau que le fichier python) avec les clés et leurs valeurs

OPENAI_API_KEY = "ta-grand-mere-en-short"


par contre il me surligne cette ligne

from dotenv import load_dotenv

avec le code Module import itself (PylintW0406:import-self)

et quand je lance le code j'ai ce message d'erreur:

ImportError: cannot import name 'load_dotenv' from partially initialized
 module 'dotenv' (most likely due to a circular import) 
(w:\www-statique\PYTHON\Open-api-bible-3.12\dotenv.py)


voici le pip list de l'environnement virtuel:

annotated-types   0.7.0    
anyio             4.9.0    
certifi           2025.6.15
colorama          0.4.6    
distro            1.9.0    
h11               0.16.0   
httpcore          1.0.9    
httpx             0.28.1   
idna              3.10     
jiter             0.10.0   
openai            1.93.0   
pip               25.1.1   
playsound         1.3.0    
pydantic          2.11.7   
pydantic_core     2.33.2   
python-dotenv     1.1.1    
setuptools        80.9.0   
sniffio           1.3.1    
tqdm              4.67.1   
typing_extensions 4.14.0   
typing-inspection 0.4.1    
wheel             0.45.1   

J'y comprends rien...
Modérateur
Salut Lionel,

lionel_css3 a écrit :
et quand je lance le code j'ai ce message d'erreur:

ImportError: cannot import name 'load_dotenv' from partially initialized
 module 'dotenv' (most likely due to a circular import) 
(w:\www-statique\PYTHON\Open-api-bible-3.12\dotenv.py)


C'est une erreur classique en Python. C'est deux class (ou plus) s'importent mutuellement, créant une dépendance cyclique. Cela peut entraîner des erreurs de type ImportError ou des comportements inattendus si la dépendance n'est pas gérée correctement.

Voici un exemple simple pour illustrer une importation circulaire :

Imaginons deux fichiers Python, class_a.py et class_b.py, qui tentent de s'importer l'un l'autre.

class_a.py

print("Début de l'exécution de module_a.py")

from module_b import ModuleB # Importe ModuleB depuis module_b

class ClassA:
    def __init__(self, name):
        self.name = name

    def greet(self):
        print(f"Bonjour de ModuleA, je m'appelle {self.name}!")
        # Tente d'utiliser une fonction ou une classe de ClassB
        b_instance = ClassB("Instance B de ClassA")
        b_instance.farewell()

print("Fin de l'exécution de module_a.py")


class_b.py

print("Début de l'exécution de class_b.py")

from class_a import ClassA # Importe ClassA depuis class_a

class ClassB:
    def __init__(self, name):
        self.name = name

    def farewell(self):
        print(f"Au revoir de ClassB, je m'appelle {self.name}!")
        # Tente d'utiliser une fonction ou une classe de ClassA
        a_instance = ClassA("Instance A de ClassB")
        a_instance.greet()

print("Fin de l'exécution de module_b.py")


Lorsque tu tentes d'exécuter l'une de ces class (par exemple, en créant un fichier main.py et en important l'une d'eux, ou simplement en exécutant python class_a.py ou python class_b.py), voici ce qui se passe :

1. Python commence à exécuter class_a.py.
2. Il arrive à la ligne from class_b import ClassB.
3. Python tente alors d'importer class_b.py.
4. Lorsque class_b.py commence son exécution, il arrive à la ligne from class_a import ClassA.

À ce stade, class_a.py est déjà en cours d'exécution et n'a pas encore terminé de définir ClassA (car il attend que class_b.py finisse d'être importé).

Python se retrouve dans un état où class_a tente d'importer class_b, et class_b tente d'importer class_a avant que l'un d'eux n'ait complètement défini ses objets, ce qui conduit à une ImportError ou, dans certains cas plus subtils, à un objet ClassA ou ClassB qui n'est pas encore entièrement construit ou qui manque d'attributs.

Pour répondre à ton souci général, je viens de tester et j'ai bien une réponse. C'est une erreur.

main.py

import os
from openai import OpenAI
from dotenv import load_dotenv


if __name__ == '__main__':
    load_dotenv()
    key = os.getenv('API_KEY')
    client = OpenAI(api_key=key)
    response = client.responses.create(
        model="gpt-4o",
        instructions="You're a Python expert",
        input="How do I check if a Python object is an instance of a class?",
    )

    print(response.output_text)


la réponse :

(hello-openai) user@host:~/www/divers/alsacreations/hello-openai$ python main.py 
Traceback (most recent call last):
  File "/home/user/www/divers/alsacreations/hello-openai/main.py", line 10, in <module>
    response = client.responses.create(
  File "/home/user/www/divers/alsacreations/hello-openai/.venv/lib/python3.9/site-packages/openai/resources/responses/responses.py", line 735, in create
    return self._post(
  File "/home/user/www/divers/alsacreations/hello-openai/.venv/lib/python3.9/site-packages/openai/_base_client.py", line 1249, in post
    return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls))
  File "/home/user/www/divers/alsacreations/hello-openai/.venv/lib/python3.9/site-packages/openai/_base_client.py", line 1037, in request
    raise self._make_status_error_from_response(err.response) from None
openai.RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs:  https://platform.openai.com/docs/guides/error-codes/api-errors.',  'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}


Mon message d'erreur est explicite, je dois passer à la caisse pour pouvoir utiliser OpenAI.

ps : mdr => ta mère en short Smiley lol
Modifié par Niuxe (02 Jul 2025 - 20:30)
a écrit :

C'est une erreur classique en Python. C'est deux class (ou plus) s'importent mutuellement, créant une dépendance cyclique. Cela peut entraîner des erreurs de type ImportError ou des comportements inattendus si la dépendance n'est pas gérée correctement.


j'ai vu cette explication mais dans mon cas je dois faire quoi?
utiliser dotenv sur Python ça devrait être un acte banal...

upload/1751482977-40948-python-circular.jpg
Modérateur
Pylint ne gère pas python-dotenv. Ça n'a rien à voir.

Dans ta capture écran, je vois que tu as plusieurs fichiers dans ton dossier. Ouvre un nouveau projet avec un venv.

Sur windows, de mémoire et en utilisant venv de base¹ :

mkdir projet_openai
cd projet_openai
python -m venv .venv
.venv\Scripts\activate.bat

La dernière ligne permet d'activer l'env virtuel. Les joies de Windows.... Tu ne peux pas voir si l'env virtuel est activé. Sur Unix, le nom de l'env virtuel s'affiche dans le prompt entre parenthèses en début de ligne.
exemple chez moi :

(hello-openai) user@host:~/www/divers/alsacreations/hello-openai$ 

Bref, Une fois fait, tu installes :

pip install python-dotenv openai

Tu crées un nouveau fichier au nom de main.py.
Tu reprends le code que je t'ai partagé dans notre discussion plus haut.
Pour finir, tu l'exécutes
python main.py


____
¹ Les instructions que je t'ai données pour créer ton env virtuel, c'est du très basique et historique. Il y a son lot de contraintes. Je te recommande d'apprendre à utiliser pipenv Smiley cligne On se casse moins la tête. La doc officielle recommande de l'utiliser. Si tu veux aller plus loin, il y a poetry. Mais pipenv, c'est largement suffisant. Smiley cligne
Modifié par Niuxe (03 Jul 2025 - 00:42)
Niuxe a écrit :

Pylint ne gère pas python-dotenv. Ça n'a rien à voir.

Il ne le gère pas mais il fait apparaître les erreurs qu'il détecte

Niuxe a écrit :

Tu ne peux pas voir si l'env virtuel est activé.

Si... mais ça dépend du type de terminal ouvert dans VSCode (terminal Python ou terminal Powershell), et dans tous les cas j'ai ma commande magique pour vérifier l'exécutable en cours
python -c "import sys; print(sys.executable)"

-------
Sinon, j'ai fait un essai sur une autre machine, ça marche.
J'ai refait un dossier sur la première machine en recommençant à zéro et là maintenant ça marche... la seule différence c'est que dans le premiers cas j'avais installé dotven après openai..


bizarre

upload/1751527577-40948-dotenv-solved.jpg
Modérateur
lionel_css3 a écrit :

Il ne le gère pas mais il fait apparaître les erreurs qu'il détecte


C'est son but. En complément, tu as flake8. Si tu veux utiliser les 2 en même temps, il y a tox qui te permet de faire ça. C'est un outil dans lequel, tu peux aussi greffer pytest ou unitest

Je sais qu'avec VSC, tu peux avoir les 2 (flake8 remplacé par autopep8, et pylint intégré dans une extension)

Pycharm Community Edition est un IDE gratuit. Si tu ne fais que du python, il est largement mieux que VSC.

lionel_css3 a écrit :

Si... mais ça dépend du type de terminal ouvert dans VSCode (terminal Python ou terminal Powershell), et dans tous les cas j'ai ma commande magique pour vérifier l'exécutable en cours
python -c "import sys; print(sys.executable)"



En lisant cette ligne de code, je pense que ça doit te donner le chemin du binaire python (celui du .venv ou du système)

lionel_css3 a écrit :

Sinon, j'ai fait un essai sur une autre machine, ça marche.
J'ai refait un dossier sur la première machine en recommençant à zéro et là maintenant ça marche... la seule différence c'est que dans le premiers cas j'avais installé dotven après openai..


Normalement, il n'y a pas de notions de priorités dans une install de package.
Modifié par Niuxe (03 Jul 2025 - 11:36)