Nb maxi d'arguments ?

10 réponses
Avatar
Michel Claveau - MVP
Bonjour !

[Python 2.7 sous Windows]

Sauriez-vous quelle est la longueur maximale, pour les arguments passés
à un script, en ligne de commande ?

Parce que je tombe régulièrement sur ce message :
"Impossible de démarrer l'exécution. La liste des arguments est trop longue."

Au début, je pensais à une limite Windows, mais un petit programme
compilé avec TCC n'a pas d'erreur, avec les mêmes arguments...

Autre question, corrolaire, comment contourner la limite ?

Merci d'avance, pour toute réponse.

@-salutations
--
Michel Claveau

10 réponses

Avatar
Alain Ketterlin
"Michel Claveau - MVP"
writes:

[Python 2.7 sous Windows]

Sauriez-vous quelle est la longueur maximale, pour les arguments passà ©s
à un script, en ligne de commande ?

Parce que je tombe régulièrement sur ce message : "Impossible de
démarrer l'exécution. La liste des arguments est trop longue."



C'est normal, et c'est une bonne chose. Le shell (cmd.exe j'imagine)
doit placer tous ces arguments dans une zone de mémoire, qui est
transmise au processus (python) qui doit pouvoir y accéder. Ne pas
placer de limite présenterait un risque de déni de service.

Au début, je pensais à une limite Windows, mais un petit progra mme
compilé avec TCC n'a pas d'erreur, avec les mêmes arguments...



C'est étonnant. Il se peut qu'il y ait une différence entre le la ncement
interactif et le lancement depuis un script, mais normalement ce n'est
pas le cas (note aussi que les variables d'environnement comptent aussi
dans le budget alloué à un processus).

Autre question, corrolaire, comment contourner la limite ?



Placer tes arguments dans un fichier et lire le fichier. Mais cela
dépend de ce que fait ton programme : s'il itère simplement sur s es
paramètres, autant l'appeler plusieurs fois (c'est ce que fait xargs
sous linux).

-- Alain.
Avatar
Francois Lafont
Bonjour,

Le 30/03/2012 09:39, Alain Ketterlin a écrit :

Sauriez-vous quelle est la longueur maximale, pour les arguments passés
à un script, en ligne de commande ?

Parce que je tombe régulièrement sur ce message : "Impossible de
démarrer l'exécution. La liste des arguments est trop longue."



C'est normal, et c'est une bonne chose. Le shell (cmd.exe j'imagine)
doit placer tous ces arguments dans une zone de mémoire, qui est
transmise au processus (python) qui doit pouvoir y accéder. Ne pas
placer de limite présenterait un risque de déni de service.



Question de béotien : j'avais cru lire dans je ne sais plus quel forum
(fr.comp.os.linux.configuration je crois), que sous Linux désormais un
script shell n'avait plus de limite en nombre d'arguments. Ce n'est pas
le cas ?

Désolé pour cette petite digression.


--
François Lafont
Avatar
Alain Ketterlin
Francois Lafont writes:

Sauriez-vous quelle est la longueur maximale, pour les arguments pass és
à un script, en ligne de commande ?



C'est normal, et c'est une bonne chose. Le shell (cmd.exe j'imagine)
doit placer tous ces arguments dans une zone de mémoire, qui est
transmise au processus (python) qui doit pouvoir y accéder. Ne pas
placer de limite présenterait un risque de déni de service.



Question de béotien : j'avais cru lire dans je ne sais plus quel for um
(fr.comp.os.linux.configuration je crois), que sous Linux désormais un
script shell n'avait plus de limite en nombre d'arguments. Ce n'est pas
le cas ?



Oui et non : on peut augmenter la taille (via sysconf). A tout moment,
tu peux voir la taille max avec : getconf ARG_MAX.

-- Alain.
Avatar
Encolpe Degoute
Le 30/03/2012 12:19, Francois Lafont a écrit :
Question de béotien : j'avais cru lire dans je ne sais plus quel forum
(fr.comp.os.linux.configuration je crois), que sous Linux désormais un
script shell n'avait plus de limite en nombre d'arguments. Ce n'est
pas le cas ? Désolé pour cette petite digression.



Cela dépend du shell utilisé (bash, zsh, tcsh...) et du programme lancé.
faire un 'grep error /var/log/toto2011*' avec plusieurs dizaine de
milliers de fichier correspondant à toto2011* peut mener à un nombre
trop important d'argument lorsque toto2011* est remplacé par toutes les
noms correspondants avant d'être envoyé à grep.

Il y aura le même problème avec un programme en python qui récupère ses
arguments de la ligne de commande. C'est un problème avec la fonction
d'extension des joker du shell, pas avec Python ou avec le script shell.

--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales
Avatar
Alain Ketterlin
Francois Lafont writes:

Oui et non : on peut augmenter la taille (via sysconf).



Ah, sysconf est une commande ? Car sur ma Squeeze je ne la trouve pas.



T'as raison c'est systcl.

-- Alain.
Avatar
Francois Lafont
Le 30/03/2012 13:26, Encolpe Degoute a écrit :

Cela dépend du shell utilisé (bash, zsh, tcsh...) et du programme lancé.
faire un 'grep error /var/log/toto2011*' avec plusieurs dizaine de
milliers de fichier correspondant à toto2011* peut mener à un nombre
trop important d'argument lorsque toto2011* est remplacé par toutes les
noms correspondants avant d'être envoyé à grep.

Il y aura le même problème avec un programme en python qui récupère ses
arguments de la ligne de commande. C'est un problème avec la fonction
d'extension des joker du shell, pas avec Python ou avec le script shell.



Ok, merci pour ces précisions.


--
François Lafont
Avatar
Alain Ketterlin
Francois Lafont writes:

# type systcl
bash: type: systcl : non trouvé



Y'avait un piège : c'est sysctl (cé-té-el) du package procps . Désolé.

-- Alain.
Avatar
YBM
Le 30.03.2012 14:39, Alain Ketterlin a écrit :
Francois Lafont writes:

# type systcl
bash: type: systcl : non trouvé



Y'avait un piège : c'est sysctl (cé-té-el) du package procps. Désolé.



Oui, mais non. sysctl c'est pour les paramètre du noyau (ce que n'est
pas le nombre d'arguments). getconf est founi avec la libc (en tout
cas sous Debian/Ubuntu).
Avatar
Laurent Pointal
Michel Claveau - MVP wrote:

Bonjour !

[Python 2.7 sous Windows]

Sauriez-vous quelle est la longueur maximale, pour les arguments passés
à un script, en ligne de commande ?



Google (pour "windows command line maximum arguments length") m'a indiqué:

http://support.microsoft.com/kb/830473

"""
Sur les ordinateurs qui exécutent Microsoft Windows XP ou une version
ultérieure, la longueur maximale de chaîne que vous pouvez utiliser à
l'invite de commandes est de 8 191 caractères. Sur les ordinateurs qui
exécutent Windows 2000 ou Windows NT 4.0, la longueur maximale de chaîne que
vous pouvez utiliser à l'invite de commandes est de 2 047 caractères.

Cette limitation s'applique à la ligne de commande, aux variables
d'environnement individuelles (telles que la variable PATH) qui sont
héritées par d'autres processus, et à toutes les extensions de variable
d'environnement. Si vous exécutez des fichiers de commandes à partir de
l'invite de commandes, cette limitation s'applique également au traitement
des fichiers de commandes.
"""

Parce que je tombe régulièrement sur ce message :
"Impossible de démarrer l'exécution. La liste des arguments est trop
longue."

Au début, je pensais à une limite Windows, mais un petit programme
compilé avec TCC n'a pas d'erreur, avec les mêmes arguments...

Autre question, corrolaire, comment contourner la limite ?



Le fichier de config qui devient fichier d'arguments...
Eventuellement la lecture sur stdin que tu peux alors prendre via un pipe ou
via une redirection de fichier.

A+
Laurent.

--
Laurent POINTAL -
3 allée des Orangers - 91940 Les Ulis - France
Tél. 01 69 29 06 59
Avatar
Alain Ketterlin
YBM writes:

Le 30.03.2012 14:39, Alain Ketterlin a écrit :
Francois Lafont writes:

# type systcl
bash: type: systcl : non trouvé



Y'avait un piège : c'est sysctl (cé-té-el) du package pro cps. Désolé.



Oui, mais non. sysctl c'est pour les paramètre du noyau (ce que n'est
pas le nombre d'arguments). getconf est founi avec la libc (en tout
cas sous Debian/Ubuntu).



T'as raison, j'ai tout mélangé et confondu avec le kern.argmax de s BSD.

-- Alain.