web-dev-qa-db-ja.com

ファイルパスを指定するときに「/ home / username /」の代わりに「〜」を使用できないのはなぜですか

たとえば~ファイルを解凍するときに、/home/username/の代わりに.Zipを使用してファイルパスを指すことができます。

しかし、今日、同じ方法でターミナルでRNNの例を実行すると、tensorflow.python.framework.errors_impl.NotFoundErrorがスローされました。

$ python ptb_Word_lm.py --data_path=~/anaconda2/lib/python2.7/site-packages/tensorflow/models-master/tutorials/rnn/simple-examples/data/ --model=small 
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.so.8.0 locally
Traceback (most recent call last):
  File "ptb_Word_lm.py", line 374, in <module>
    tf.app.run()
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/python/platform/app.py", line 44, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "ptb_Word_lm.py", line 321, in main
    raw_data = reader.ptb_raw_data(FLAGS.data_path)
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/models-master/tutorials/rnn/ptb/reader.py", line 73, in ptb_raw_data
    Word_to_id = _build_vocab(train_path)
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/models-master/tutorials/rnn/ptb/reader.py", line 34, in _build_vocab
    data = _read_words(filename)
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/models-master/tutorials/rnn/ptb/reader.py", line 30, in _read_words
    return f.read().decode("utf-8").replace("\n", "<eos>").split()
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/python/lib/io/file_io.py", line 106, in read
    self._preread_check()
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/python/lib/io/file_io.py", line 73, in _preread_check
    compat.as_bytes(self.__name), 1024 * 512, status)
  File "/home/hok/anaconda2/lib/python2.7/contextlib.py", line 24, in __exit__
    self.gen.next()
  File "/home/hok/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/errors_impl.py", line 469, in raise_exception_on_not_ok_status
    pywrap_tensorflow.TF_GetCode(status))
tensorflow.python.framework.errors_impl.NotFoundError: ~/anaconda2/lib/python2.7/site-packages/tensorflow/models-master/tutorials/rnn/simple-examples/data/ptb.train.txt

次に、~/home/username/に置き換えましたが、正常に機能しました。

RNNの例を実行するときに、ファイルパスを指すのに~の代わりに/home/username/を使用できないのはなぜですか?

詳しく教えてください。

42
JNing

~は通常、シェルによって展開されることを理解する必要があります。あなたが呼び出すプログラムはそれを見ることはなく、bashによって挿入されたフルパス名を見ます。ただし、これは、チルダが引数の先頭にある場合にのみ発生します(引用符で囲まれていません)。

実行中のPythonプログラムがgetoptなどのモジュールを使用してコマンドラインを解析する場合、--data-pathオプションの引数をチルダ展開を許可する別の「Word」として指定できます。 :

$ python ptb_Word_lm.py --data_path ~/anaconda2/lib/python2.7/...

独自のコードでは、getoptまたはargparseを引数処理に使用できます。また、@ JacobVlijmの答えが示唆するように、チルダを手動で展開することもできます。

PS。チルダは、ShellDIRNAME=~/anaconda2などの変数割り当て式の先頭でも展開されます。質問のチルダも等号に従いますが、この使用法はシェルにとって特別な意味はなく(プログラムに渡されるものにすぎません)、展開をトリガーしません。

45
alexis

Pythonでのチルダ展開

答えは短く簡単です:

以下を使用しない限り、Pythonは~を展開しません。

import os
os.path.expanduser('~/your_directory')

here も参照してください:

os.path.expanduser(path)
UnixおよびWindowsでは、〜または〜userの初期コンポーネントをそのユーザーのホームディレクトリに置き換えた引数を返します。

Unixでは、初期〜が設定されている場合、環境変数HOMEに置き換えられます。それ以外の場合、現在のユーザーのホームディレクトリは、組み込みモジュールpwdを介してパスワードディレクトリで検索されます。最初の〜userは、パスワードディレクトリで直接検索されます。

32
Jacob Vlijm

~には特定の拡張ルールがありますが、コマンドでは満足できません。具体的には、Wordの先頭(例:python ~/script.py)または変数の割り当ての先頭(例:PYTHONPATH=~/scripts python script.py)で引用されていない場合にのみ展開されます。持っているのは--data_path=~/blablaで、これはシェル用語では単一のWordなので、展開は実行されません。

即時の修正は、通常の変数展開ルールに従う$HOMEシェル変数を使用することです。

python ptb_Word_lm.py --data_path=$HOME/blabla
6