2013-03-07 7 views
6

Sto cercando di ottenere il nome del file che è indicato nella riga di comando. Per esempio:Nome file stdin Python

python3 ritwc.py < DarkAndStormyNight.txt

Sto cercando di ottenere DarkAndStormyNight.txt

Quando provo fileinput.filename() torno stesso con SYS .stdin. È possibile? Non sto cercando sys.argv [0] che restituisce il nome dello script corrente.

Grazie!

risposta

4

In generale non è possibile ottenere il nome del file in modo indipendente dalla piattaforma. Le altre risposte coprono alternative sensate come passare il nome sulla riga di comando.

Su Linux, e alcuni sistemi correlati, è possibile ottenere il nome del file tramite il seguente trucco:

import os 
print(os.readlink('/proc/self/fd/0')) 

/proc/è un filesystem speciale su Linux che fornisce informazioni sui processi sulla macchina. self indica il processo corrente in esecuzione (quello che apre il file). fd è una directory contenente collegamenti simbolici per ogni descrittore di file aperto nel processo.0 è il numero del descrittore di file per stdin.

+0

Ciao nneonneo, sai perché il mio Ubuntu ha effettivamente percorso '/ proc/self/fd/0' ma quando faccio' ./test.py 8090PZ

0

Non credo sia possibile. Per quanto riguarda il tuo script Python, sta scrivendo su stdout. Il fatto che tu stia catturando ciò che è scritto su stdout e lo scriva in un file nella tua shell non ha nulla a che fare con lo script python.

1

Infatti, come cuciture che Python non può vedere che il nome del file quando lo stdin viene reindirizzato dalla console, si dispone di un'alternativa:

zero Chiamate programma come questo:

python3 ritwc.py -i your_file.txt 

e quindi aggiungere il seguente codice per reindirizzare stdin dall'interno di pitone, in modo da avere accesso al nome del file attraverso il "filename_in" variabile:

import sys 

flag=0 
for arg in sys.argv: 
    if flag: 
     filename_in = arg 
     break 
    if arg=="-i": 
     flag=1 
sys.stdin = open(filename_in, 'r') 

#the rest of your code... 

Se ora si utilizza il co mm e:

print(sys.stdin.name) 

si ottiene il nome del file; tuttavia, quando si esegue lo stesso comando di stampa dopo aver reindirizzato lo stdin dalla console, si ottiene il risultato: <stdin>, che deve essere una prova che Python non può vedere il nome file in quel modo.

1

È possibile utilizzare ArgumentParser, che consente automattically si interfaccia con argomenti a riga di comando, e fornisce anche aiuto, ecc

from argparse import ArgumentParser 
parser = ArgumentParser()                 
parser.add_argument('fname', metavar='FILE', help='file to process') 
args = parser.parse_args() 

with open(args.fname) as f: 
    #do stuff with f 

Ora si chiama python2 ritwc.py DarkAndStormyNight.txt. Se chiami python3 ritwc.py senza argomenti, verrà restituito un errore che indica l'argomento previsto per FILE. È inoltre possibile chiamare lo python3 ritwc.py -h e verrà spiegato che è richiesto un file to process.

PS ecco un grande intro a come usarlo: http://docs.python.org/3.3/howto/argparse.html