コマンドラインで指定されたファイル名を取得しようとしています。例えば:
python3 ritwc.py < DarkAndStormyNight.txt
DarkAndStormyNight.txt を取得しようとしています
fileinput.filename() を試すと、sys.stdin と同じ結果が返されます。これは可能ですか?現在のスクリプト名を返す sys.argv[0] を探しているわけではありません。
ありがとう!
一般に、プラットフォームに依存しない方法でファイル名を取得することはできません。他の回答は、コマンドラインで名前を渡すなどの賢明な代替手段をカバーしています。
Linux および一部の関連システムでは、次の方法でファイルの名前を取得できます。
import os
print(os.readlink('/proc/self/fd/0'))
/proc
/ は、マシン上のプロセスに関する情報を提供する Linux 上の特別なファイルシステムです。self
現在実行中のプロセス (ファイルを開くプロセス) を意味します。fd
プロセスで開いている各ファイル記述子のシンボリック リンクを含むディレクトリです。0 は のファイル記述子番号ですstdin
。
を使用できます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 が必要であることが説明されfile to process
ます。
PSここにそれを使用する方法の素晴らしい紹介があります:http://docs.python.org/3.3/howto/argparse.html
実際、stdin がコンソールからリダイレクトされたときに python がそのファイル名を認識できないことがわかっているため、別の方法があります。
次のようにプログラムを呼び出します。
python3 ritwc.py -i your_file.txt
次に、変数「filename_in」を介してファイル名にアクセスできるように、次のコードを追加して、Python 内から stdin をリダイレクトします。
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)
ファイル名を取得します。ただし、コンソールから stdin をリダイレクトした後に同じ print コマンドを実行すると、次の結果が得<stdin>
られます。
それは不可能だと思います。Pythonスクリプトに関する限り、それはstdoutに書き込んでいます。stdoutに書き込まれたものをキャプチャし、それをシェルのファイルに書き込んでいるという事実は、Pythonスクリプトとは何の関係もありません。