2013-03-07 4 views
6

私はコマンドラインで与えられたファイル名を取得しようとしています。たとえば、次のようにPython stdin filename

のpython3のritwc.py < DarkAndStormyNight.txt

私は戻って、SYSと同じ取得)私はfileinput.filename(しようとするとDarkAndStormyNight.txt

を取得しようとしています.stdin。これは可能ですか?私は現在のスクリプト名を返すsys.argv [0]を探していません。

ありがとうございます!

答えて

4

プラットフォームに依存しない方法でファイル名を取得することはできません。他の答えは、コマンドラインで名前を渡すような賢明な選択肢をカバーしています。 Linuxの

、およびいくつかの関連システム、あなたは以下のトリックを通じてファイルの名前を取得することができます。

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

/proc /マシン上のプロセスに関する情報を提供するLinux上で特別なファイルシステムです。 selfは、現在実行中のプロセス(ファイルを開くプロセス)を意味します。 fdは、プロセス内の開いているファイル記述子ごとにシンボリックリンクを含むディレクトリです。0はstdinのファイル記述子番号です。

+0

私のubuntuが本当に/ proc/self/fd/0のパスを持っているのか知っていますか? './test.py 8090PZ

0

私は考えられません。限り、あなたのpythonスクリプトがstdoutに書いている懸念されています。あなたがstdoutに書き込まれたものをキャプチャし、それをあなたのシェルのファイルに書き込むという事実は、pythonスクリプトとは関係ありません。実際に

1

、それは標準入力をコンソールからリダイレクトされたときにPythonがそのファイル名を見ることができないことを縫い目として、あなたは選択肢を持っている:

はこのようにあなたのプログラムを呼び出します。

python3 ritwc.py -i your_file.txt 

、その後追加あなたは、変数「filename_in」経由のファイル名へのアクセス権を持っているように、次のコードは、pythonの中から標準入力をリダイレクトします

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

今あなたが共同使用している場合mmand:

print(sys.stdin.name) 

あなたはファイル名を取得します。しかし、コンソールからstdinをリダイレクトした後に同じ印刷コマンドを実行すると、結果は<stdin>になります。これは、pythonがそのようにファイル名を見ることができないという証拠になります。

1

あなたは今、あなたはpython2 ritwc.py DarkAndStormyNight.txtを呼び出すautomatticallyあなたはコマンドライン引数とインターフェースを与え、さらにはヘルプを提供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 

を使用することができます。引数なしでpython3 ritwc.pyを呼び出すと、FILEの期待される引数であることを示すエラーが表示されます。 python3 ritwc.py -hにも電話することができ、file to processが必要であることを説明します。

PSは、ここでそれを使用する方法に大きなイントロです:http://docs.python.org/3.3/howto/argparse.html一般に

関連する問題