2015-09-27 4 views
1

Dans le code, je maintiens que je cours à travers:Comment puis-je obtenir en python la longueur maximale du chemin du système de fichiers dans unix?

from ctypes.wintypes import MAX_PATH 

Je voudrais changer quelque chose comme:

try: 
    from ctypes.wintypes import MAX_PATH 
except ValueError: # raises on linux 
    MAX_PATH = 4096 # see comments 

mais je ne peux pas trouver un moyen d'obtenir la valeur du système de fichiers max path from python (os, os.path, sys...) - existe-t-il un moyen standard ou ai-je besoin d'une librairie externe?

Ou il n'y a pas d'analogue comme MAX_PATH dans linux, au moins pas une norme parmi les distributions?


Answer

try: 
    MAX_PATH = int(subprocess.check_output(['getconf', 'PATH_MAX', '/'])) 
except (ValueError, subprocess.CalledProcessError, OSError): 
    deprint('calling getconf failed - error:', traceback=True) 
    MAX_PATH = 4096 
+1

Il est 4096 sur Linux - http://unix.stackexchange.com/questions/32795/what-is-the-maximum-allowed-filename-and-folder-size-with-ecryptfs – jonrsharpe

+0

@jonrsharpe: pas de manière programmatique pour y arriver? –

Répondre

2

Vous pouvez lire ces valeurs à partir de fichiers:

* PATH_MAX (defined in limits.h) 
* FILENAME_MAX (defined in stdio.h) 

Ou utilisez subprocess.check_output() avec getconf fonction:

$ getconf NAME_MAX/
$ getconf PATH_MAX/

une s dans l'exemple suivant:

name_max = subprocess.check_output("getconf NAME_MAX /", shell=True) 
path_max = subprocess.check_output("getconf PATH_MAX /", shell=True) 

pour obtenir des valeurs et fpath pour définir des valeurs différentes pour les fichiers.

+0

Tout d'abord, est-ce que 'shell = True' est utilisé pour éviter de passer des chemins absolus? Et cet appel getconf est-il portable? Puis-je avoir besoin de droits root en l'utilisant? –

+0

1. 'shell = TRUE' fait que la commande spécifiée sera exécutée par le shell 2. appel getconf est portable dans les systèmes unix/linux, pas dans les fenêtres 3. racine n'est pas nécessaire – WojtekCh

+0

Bon +1 pour un effort supplémentaire - 1. shell = True - Je sais ce qu'il fait mais quelle différence cela fait-il ici (j'ai testé sans - je reçois 'OSError: [Errno 2] Aucun fichier ou répertoire' - pourquoi?)? En d'autres termes, pourriez-vous réécrire cela avec Popen? 4. Apparemment, je devrais attraper CalledProcessError __and__ OSError __and__ ....? –