[Python-de] Re: XML, Umlaute, Unicode, Projektorganisation, RPC, MPUC - Wer bietet mehr?

Martin v. Löwis martin at v.loewis.de
Don Jul 24 20:25:05 EDT 2003


Detlef Lannert <lannert at uni-duesseldorf.de> writes:

> Wenn ich mich recht entsinne, war für Python 2.3 versprochen worden, daß
> die PendingDeprecationWarning (z.B. bei Umlauten in Kommentaren) global
> abgestellt werden kann 

Dieser Satz nimmt zwei separate Versprechen an:
1. PendingDeprecationWarning kann man global abschalten.
   Das ist so, und sie sind sogar by default abgeschaltet (-Wall)
2. Umlaute in Kommentaren führen zu PendingDeprecationWarning.
   Das ist nicht so, und war auch nicht versprochen worden;
   statt dessen führen sie zu DeprecationWarning.

Mit dem warnings-Modul kann man natürlich diese Warnung wie auch jede
andere abschalten.

> Dafür ist die Datei dann unter Linux nicht mehr als ausführbares
> Programm zu gebrauchen (das #! wird nicht erkannt). Unter Windows mag
> das gehen, für Linux ist auf absehbare Zeit dringend davon abzuraten.

Ich habe persönlich nicht den Drang, davon abzuraten :-)

Stimmt, man kann das für Skripte gegenwärtig nicht verwenden, aber
a) heute ist nicht aller Tage, und
b) nicht alle Quelltextfiles sind Skripte

Ciao,
Martin

--- binfmt_script.c.orig	Mon Feb 25 06:28:36 2002
+++ binfmt_script.c	Mon Feb 25 07:48:19 2002
@@ -1,7 +1,7 @@
 /*
  *  linux/fs/binfmt_script.c
  *
- *  Copyright (C) 1996  Martin von Löwis
+ *  Copyright (C) 1996, 2002  Martin von Löwis
  *  original #!-checking implemented by tytso.
  */
 
@@ -23,7 +23,16 @@
 	char interp[BINPRM_BUF_SIZE];
 	int retval;
 
-	if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || (bprm->sh_bang)) 
+	/* It is a recursive invocation. */
+	if (bprm->sh_bang)
+		return -ENOEXEC;
+
+	/* It starts neither with #!, nor with #! preceded by
+	   the UTF-8 signature. */
+	if (!(((bprm->buf[0] == '#') && (bprm->buf[1] == '!'))
+	      || ((bprm->buf[0] == '\xef') && (bprm->buf[1] == '\xbb')
+		  && (bprm->buf[2] == '\xbf') && (bprm->buf[3] == '#')
+		  && (bprm->buf[4] == '!'))))
 		return -ENOEXEC;
 	/*
 	 * This section does the #! interpretation.
@@ -46,7 +55,8 @@
 		else
 			break;
 	}
-	for (cp = bprm->buf+2; (*cp == ' ') || (*cp == '\t'); cp++);
+	cp = (bprm->buf[0]=='\xef') ? bprm->buf+5 : bprm->buf+2;
+	while ((*cp == ' ') || (*cp == '\t')) cp++;
 	if (*cp == '\0') 
 		return -ENOEXEC; /* No interpreter name found */
 	i_name = cp;