Имя файла Python stdin

Я пытаюсь получить имя файла, указанное в командной строке. Например:

python3 ritwc.py

Я пытаюсь получить DarkAndStormyNight.txt

когда я пытаюсь fileinput.filename () я получаю то же самое с sys.стандартный ввод. Возможно ли это? Я не ищу sys.argv[0], который возвращает текущее имя скрипта.

спасибо!

4 ответов


В общем невозможно получить имя файла агностическим способом. Другие ответы охватывают разумные альтернативы, такие как передача имени в командной строке.

в Linux и некоторых связанных системах вы можете получить имя файла с помощью следующего трюка:

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

/proc/ - Это специальная файловая система в Linux, которая предоставляет информацию о процессах на компьютере. self означает текущий запущенный процесс (тот, что открыть файл.) fd - каталог, содержащий символические ссылки для каждого открытого файлового дескриптора в процессе. 0-номер дескриптора файла для stdin.


фактически, поскольку python не может видеть это имя файла при перенаправлении stdin с консоли, у вас есть альтернатива:

назовите свою программу так:

python3 ritwc.py -i your_file.txt

а затем добавьте следующий код для перенаправления stdin изнутри python, чтобы у вас был доступ к имени файла через переменную "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...

если теперь вы используете команду:

print(sys.stdin.name)

вы получаете свое имя файла; однако, когда вы делаете то же самое команда print после перенаправления stdin с консоли вы получите результат:<stdin>, что должно быть доказательством того, что python не может видеть имя файла таким образом.


можно использовать ArgumentParser, который автоматически дает вам интерфейс с аргументами командной строки и даже предоставляет помощь и т. д.

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

теперь вы звоните python2 ritwc.py DarkAndStormyNight.txt. Если вы позвоните python3 ritwc.py без аргумента, это даст ошибку, говоря, что это ожидаемый аргумент для FILE. Вы также можете теперь позвонить python3 ritwc.py -h и это объяснит, что a это.

P. S. Вот многие интро в как использовать: http://docs.python.org/3.3/howto/argparse.html


Я не думаю, что это возможно. Что касается вашего скрипта python, он пишет в stdout. Тот факт, что вы захватываете то, что написано в stdout и записываете его в файл в своей оболочке, не имеет ничего общего со скриптом python.