8

コマンドラインで指定されたファイル名を取得しようとしています。例えば:

python3 ritwc.py < DarkAndStormyNight.txt

DarkAndStormyNight.txt を取得しようとしています

fileinput.filename() を試すと、sys.stdin と同じ結果が返されます。これは可能ですか?現在のスクリプト名を返す sys.argv[0] を探しているわけではありません。

ありがとう!

4

4 に答える 4

6

一般に、プラットフォームに依存しない方法でファイル名を取得することはできません。他の回答は、コマンドラインで名前を渡すなどの賢明な代替手段をカバーしています。

Linux および一部の関連システムでは、次の方法でファイルの名前を取得できます。

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

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

于 2013-03-07T04:29:52.250 に答える
2

を使用できます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

于 2013-03-07T04:26:03.247 に答える
1

実際、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>られます。

于 2013-03-07T01:06:09.120 に答える
0

それは不可能だと思います。Pythonスクリプトに関する限り、それはstdoutに書き込んでいます。stdoutに書き込まれたものをキャプチャし、それをシェルのファイルに書き込んでいるという事実は、Pythonスクリプトとは何の関係もありません。

于 2013-03-07T00:46:25.860 に答える