im NOUVEAU en Python, de nombreuses heures de googled et de recherche ici dans Stackoverflow. Mais j'ai toujours un problème avec mon code. J'ai besoin de courir foo em> fonction dans l'intervalle de temps et remplissez DataFrame (par exemple, chaque seconde ajoutez horodatage à DF). Je rencontre toujours un message d'erreur: NameError: strong> nom 'df' n'est pas défini em> merci pour votre réponse. P> code : P> runfile('C:/Users/Miro/.spyder-py3/untitled8.py', wdir='C:/Users/Miro/.spyder-py3')
Exception in thread Thread-8:
Traceback (most recent call last):
File "C:\Users\Miro\Anaconda3\envs\spyder_4_0_1\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Users\Miro\.spyder-py3\untitled8.py", line 90, in run
self.execute(*self.args, **self.kwargs)
File "C:\Users\Miro\.spyder-py3\untitled8.py", line 68, in foo
df = df.append(df2)
NameError: name 'df' is not defined
2020-06-16 08_29_31.920157
Program killed: running cleanup code
4 Réponses :
Définir global df code> avant
programme de classe (exception): code> p>
Merci beaucoup, j'ajouterai "Global DF" et "df = pd.dataframe ([[])" avant "programme de classe (exception):" et le script va commei.
En fait, vous n'avez pas besoin d'ajouter Global DF code> au-dessus de la définition de la classe. Il est utilisé uniquement dans les définitions de la fonction. Et le
df code> pourrait être inférieur à la classe ainsi que ci-dessus. Le problème était la mauvaise indentation.
Cela signifie que DF est une variable de classe et ne fonctionne pas.
class ProgramKilled(Exception): global df df = pd.DataFrame([]) pass
Vous avez fabriqué juste changer à p> df code> partie de l'espace de noms code> de programme code>. Juste le dédent et devient une variable de niveau de module. Fonctions qui souhaitent l'affecter ultérieurement utilisent
Global DF CODE> - mais vous faites déjà cette pièce correctement dans votre code.
class ProgramKilled(Exception):
pass
df = pd.DataFrame([])
J'ai fait un changement comme vous l'avez écrit et que le script fonctionne. Merci
Merci à tous pour vos réponses utiles et rapides. Cette solution fonctionne:
WAIT_TIME_SECONDS = 1 global df df = pd.DataFrame([]) class ProgramKilled(Exception): pass ############################################################ ############################################################ def foo(): global df time1 = str(datetime.now()) time2 = time1.replace(":", "_") print(time2) df2 = pd.DataFrame(data= { 'timestamp': [time2], 'cas_zapas_1_text': ['cas'] }) df = df.append(df2) ############################################################ ############################################################ def signal_handler(signum, frame): raise ProgramKilled class Job(threading.Thread): def __init__(self, interval, execute, *args, **kwargs): threading.Thread.__init__(self) self.daemon = False self.stopped = threading.Event() self.interval = interval self.execute = execute self.args = args self.kwargs = kwargs def stop(self): self.stopped.set() self.join() def run(self): while not self.stopped.wait(self.interval.total_seconds()): self.execute(*self.args, **self.kwargs) if __name__ == "__main__": signal.signal(signal.SIGTERM, signal_handler) signal.signal(signal.SIGINT, signal_handler) job = Job(interval=timedelta(seconds=WAIT_TIME_SECONDS), execute=foo) job.start() while True: try: time.sleep(1) except ProgramKilled: print("Program killed: running cleanup code") job.stop() break
Pas besoin de ce Global DF code>. Le problème était simplement l'indentation.
Vous n'avez pas défini le fichier dataframe
df code>. Peut-être que cette ligne doit être indentée extérieure
df = pd.dataframe ([]) code>
Veuillez afficher la trace de trace afin que nous puissions facilement repérer où l'erreur se produit. Et envisagez de couper l'exemple. Moins de code à patte à travers est égal à des examinateurs heureux.
@TDelaney question est mise à jour
df = pd.dataframe ([]) code> est indenté de sorte que sa partie de la définition de la classe. Ce n'est pas une variable de niveau de module. Mais il existe également un
code> en haut de la définition de la classe, suggérant que vous vouliez vraiment que la variable soit un niveau de module. Dans ce cas, le détenteur de cette ligne.