Имя файла 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.