Python Frage

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
xcomm
Beiträge: 804
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Python Frage

Beitrag von xcomm » 23.08.2008 09:28:06

Hi Gemeinde,

ich nutze das Python-Script `pyauthanalyzer` für ssh-Abuse.
http://cubic.frametic.fi/pyauthanalyzer/

Da es Probleme mit os.popen unter Solaris zu geben scheint (in diesem Fall bringt gwhois `Unknown AS number or IP network`), habe ich versucht os.popen zu ersetzen:
http://docs.python.org/lib/node538.html

Code: Alles auswählen

def get_abuse_address(ip):
  # Try to determine the abuse e-mail address. Cludgy piece of shit, but works
  mails = []
  # whois_c = os.popen('whois %s' % ip, 'r', 1)
  whois_c = Popen('whois %s' % ip, shell=True, bufsize=1, stdout=PIPE) .stdout
  whois_data = map(str.strip, whois_c.readlines())
  whois_c.close()
  
Meine Zeile bringt:

Code: Alles auswählen

  File "/usr/sbin/pyauthanalyzer", line 134

    whois_c = Popen('whois %s' %ip, shell=True, bufsize=1, stdout=PIPE).stdout
                                                                             ^
IndentationError: unindent does not match any outer indentation level

Sieht jemand, der mehr von Python versteht, den Fehler?

Danke, xcomm

dimi
Beiträge: 84
Registriert: 19.07.2006 14:09:55

Re: Python Frage

Beitrag von dimi » 23.08.2008 13:34:40

Funktioniert bei mir genau so wie Du es geschrieben hast.
Steht in der Datei vielleicht ein Mix aus Tabs und Leerzeichen zum Einrücken? Das kommt schon mal vor, wenn man eine Datei von jemandem bearbeitet der gerade die andere Variante bevorzugt.
Konvention sind 4 Leerzeichen pro Einrückung, bevorzugt auch als richtige Leerzeichen und nicht als Tab.
In meiner .vimrc hab ich dafür stehen:

Code: Alles auswählen

set tabstop =4
set shiftwidth=4
set expandtab
Danach kann man mit ':retab' in vim die Tabs einheitlich in Leerzeichen umwandeln.

Benutzeravatar
npi
Beiträge: 567
Registriert: 03.08.2003 17:52:10

Re: Python Frage

Beitrag von npi » 23.08.2008 19:18:55

Wenn man Leerzeichen für die Einrückung verwendet, müssen glaube ich und wenn ich http://docs.python.org/ref/indentation.html richtig verstanden habe, immer acht Zeichen für eine Einrückung verwendet werden, sonst zählt es als nicht eingerückt. Vllt hängt der Fehler damit zusammen.

gruß,
npi
"Bis zur Unendlichkeit, und noch viel weiter!"
--Buzz, Toystory

dimi
Beiträge: 84
Registriert: 19.07.2006 14:09:55

Re: Python Frage

Beitrag von dimi » 24.08.2008 11:41:24

Nee, da hast du was falsch verstanden.
http://python.org/dev/peps/pep-0008/ hat geschrieben: Indentation

Use 4 spaces per indentation level.

For really old code that you don't want to mess up, you can continue to
use 8-space tabs.

Tabs or Spaces?

Never mix tabs and spaces.

The most popular way of indenting Python is with spaces only. The
second-most popular way is with tabs only. Code indented with a mixture
of tabs and spaces should be converted to using spaces exclusively. When
invoking the Python command line interpreter with the -t option, it issues
warnings about code that illegally mixes tabs and spaces. When using -tt
these warnings become errors. These options are highly recommended!

For new projects, spaces-only are strongly recommended over tabs. Most
editors have features that make this easy to do.

Benutzeravatar
xcomm
Beiträge: 804
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Re: Python Frage

Beitrag von xcomm » 30.08.2008 13:25:55

Hi Ihr,

sorry für die späte Antwort. Ihr hattet vollkommen Recht:

Code: Alles auswählen

cat -t pyauthanalyzer
...
^Imails = []
  whois_c = os.popen('whois %s' % ip, 'r', 1)
  # whois_c = Popen('whois %s' % ip, shell=True, bufsize=1, stdout=PIPE).stdout
  # whois_c = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
^Iwhois_data = map(str.strip, whois_c.readlines())
..
Nun tut es wieder.

Code: Alles auswählen

cat -t pyauthanalyzer
...
^Imails = []
^Iwhois_c = os.popen('whois %s' % ip, 'r', 1)
^I# whois_c = Popen('whois %s' % ip, shell=True, bufsize=1, stdout=PIPE).stdout
^I# whois_c = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
^Iwhois_data = map(str.strip, whois_c.readlines())
..
Danke, xcomm

Antworten