2013-03-07 14 views
6

Próbuję uzyskać nazwę pliku podanego w wierszu poleceń. Na przykład:Python stdin filename

python3 ritwc.py < DarkAndStormyNight.txt

Próbuję dostać DarkAndStormyNight.txt

Kiedy próbuję fileinput.filename() wrócę samo z sys .stdin. czy to możliwe? Nie szukam sys.argv [0], która zwraca bieżącą nazwę skryptu.

Dzięki!

Odpowiedz

4

W ogólnym nie jest możliwe, aby uzyskać nazwę pliku w taki sposób, platforma-agnostyk. Pozostałe odpowiedzi obejmują rozsądne alternatywy, takie jak podanie nazwiska w linii poleceń.

W systemie Linux, a niektóre związane z nimi systemy, można uzyskać nazwę pliku za pomocą następującej sztuczki:

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

/proc/to specjalny system plików w systemie Linux, który zawiera informacje na temat procesów w maszynie. self oznacza bieżący uruchomiony proces (ten, który otwiera plik). fd to katalog zawierający dowiązania symboliczne dla każdego otwartego deskryptora pliku w procesie.0 to numer deskryptora pliku dla stdin.

+0

Cześć nneonneo, czy wiesz, dlaczego mój ubuntu rzeczywiście ma ścieżkę '/ proc/self/fd/0' ale kiedy robię' ./test.py 8090PZ

0

Nie sądzę, że to możliwe. Jeśli chodzi o twój skrypt Pythona, to pisze on do stdout. Fakt, że przechwytujesz to, co jest napisane na standardowe wyjście i zapisujesz je do pliku w twojej powłoce, nie ma nic wspólnego ze skryptem Pythona.

1

W rzeczywistości, jak szwy, że pyton nie widać tego pliku, gdy stdin jest przekierowany z konsoli, masz alternatywę:

zadzwonić do programu tak:

python3 ritwc.py -i your_file.txt 

a następnie dodać następujący kod przekierować stdin od wewnątrz python, dzięki czemu masz dostęp do pliku za pomocą zmiennej „filename_in”:

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... 

Jeśli teraz użyć CO mmi:

print(sys.stdin.name) 

otrzymasz nazwę pliku; jednak, gdy zrobisz to samo polecenie drukowania po przekierowaniu stdin z konsoli, uzyskasz wynik: <stdin>, co będzie dowodem, że python nie widzi nazwy pliku w ten sposób.

1

Można użyć ArgumentParser, co daje Ci automattically współpracować z argumentów wiersza poleceń, a nawet udziela pomocy, itp

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 

Teraz nazywają python2 ritwc.py DarkAndStormyNight.txt. Jeśli wywołasz python3 ritwc.py bez argumentu, spowoduje to błąd mówiący, że oczekiwano argumentu za FILE. Możesz także teraz zadzwonić pod numer python3 ritwc.py -h i wyjaśnić, że wymagany jest file to process.

PS tutaj to świetny wstęp, w jaki sposób z niego korzystać: http://docs.python.org/3.3/howto/argparse.html

Powiązane problemy