Seite 1 von 1

Hilfe bei: "TypeError: 'str' object is not callable&

Verfasst: Freitag 13. März 2009, 10:27
von Rabenschwinge
Hallo,

ich habe eine kleines Problem mit einem Skript, das einen Lockfile erstellen soll und wenn bereits ein Lockfil existiert stillschweigend aussteigen. Das Skript wird von cron ausgeführt und wirft mir immer solche Fehlermeldungen.

Code: Alles auswählen

Traceback (most recent call last):
File "/var/lib/booklooker/scripts/tools/fetch_backups.py", line 113, in ?
if errno == 17: exit(0)
TypeError: 'str' object is not callable 
Ich habe irgendwo FAQ gefunden in denn steht, dass der Fehler üblicherweise dann auftritt, wenn man das "str" Objekt mit einem eigenem Objekt verdeckt. Das ist aber gar nicht der Fall; eine Funktion hatte einen Parameter den ich "string" genannt hatte, aber selbst das habe ich mitlerweile geändert.

Der Fehler tritt in diesem Kontext auf:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf_8 -*-
import commands
import datetime
import os
import signal

(...)

def createLockfile(filename):
    """Tries to create the lockfile 'filename'.
    Should the file already exist this will cause an Exception."""
    fd = os.open(filename, os.O_WRONLY | os.O_CREAT |
                 os.O_EXCL | os.O_NONBLOCK, 0644)
    os.close(fd)

(...)

try:
    createLockfile(lockfilename)
except OSError, (errno, errstr):
    # "File Exists" (errno 17)errors are ok, we exit silently.
    if errno == 17: exit(0)
    else: raise
[/code]

PS: Ich verwende die in der Linux Distribution Debian (Etch) enthaltene Version 2.4.4 von Python auf den Systemen, die es ausführen und 2.5.2 aus Ubuntu (Intrepid Ibex) zum entwickeln.

Verfasst: Freitag 13. März 2009, 10:30
von Leonidas
Hallo Rabenschwinge, willkommen im Forum,

Weil du irgendwo ``exit = "Das ist ein String"`` machst. Schau mal in deinen Quelltext.

Verfasst: Freitag 13. März 2009, 10:39
von Rabenschwinge
Leider nicht. Das Wort "exit" kommt nur genau zweimal im Text vor. Einmal in dem Kommentar, und einmal in der Anweisung exit(0), beide stehen da...

Verfasst: Freitag 13. März 2009, 10:47
von helduel
Rabenschwinge hat geschrieben:Leider nicht. Das Wort "exit" kommt nur genau zweimal im Text vor. Einmal in dem Kommentar, und einmal in der Anweisung exit(0), beide stehen da...
Mach doch mal vor deinem exit() ein print exit. Ansonsten würde ich dir exit-Funktion von sys nehmen.

Verfasst: Freitag 13. März 2009, 11:15
von Rabenschwinge
Danke, sys.exit aufrufen hilft. Scheint so als exit ein String ist. Und wenn man ihn ausgibt kommt: "Use Ctrl-D (i.e. EOF) to exit."
Ist ja gut gemeint und in der Python Umgebung sicherlich hilfreich (wenn auch nicht so hilfreich wie einfach auszusteigen), aber in diesem Programm sehr irritierend.

Code: Alles auswählen

>>> type(exit)
<type 'str'>
>>> print exit
Use Ctrl-D (i.e. EOF) to exit.
>>>

Verfasst: Freitag 13. März 2009, 11:17
von Leonidas
Ja, stimmt. Als helduel es angesprochen hat ist mir dann auch aufgefallen dass es um ``exit`` und nicht um ``sys.exit`` geht. :oops: