Я могу использовать ~
вместо /home/username/
указать на путь к файлу когда, например, разархивировав a .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/
, и это работало правильно.
Почему я не мог использовать ~
вместо /home/username/
указать на путь к файлу при выполнении примера RNN?
Вы могли сказать мне подробно?
Необходимо понять, что ~
обычно расширяется оболочкой; программы, которые Вы называете, никогда не видят его, они видят полный путь, как вставлено ударом. Но это только происходит, когда тильда в начале аргумента (и не заключается в кавычки).
, Если программа Python Вы работаете, использует модуль как getopt
для парсинга его командной строки, можно дать аргумент --data-path
опция как отдельное "слово" для разрешения расширения тильды:
$ python ptb_word_lm.py --data_path ~/anaconda2/lib/python2.7/...
В Вашем собственном коде, Вы можете использовать getopt
или argparse
для обработки аргумента и могли также вручную развернуть тильды как предложенный ответ @JacobVlijm.
пз. Тильда также расширена в начале оболочка переменное выражение присваивания как DIRNAME=~/anaconda2
; хотя тильда в Вашем вопросе также следует, равняется знаку, это использование не имеет особого значения для оболочки (это просто, что-то передало программе), и не инициировал расширение.
ответ является коротким & простой:
Python не расширяется ~
, если Вы не используете:
import os
os.path.expanduser('~/your_directory')
См. также здесь :
os.path.expanduser (путь)
На Unix и Windows, возвратите спор с начальным компонентом ~ или ~user, замененного этим userвЂs корневой каталог.На Unix, начальная буква ~ заменяется переменной среды ДОМОЙ, если это установлено; иначе текущий user’s корневой каталог ищется в каталоге пароля через встроенный модуль pwd. Начальная буква ~user ищется непосредственно в каталоге пароля.
~
имеет конкретные правила расширения, которые не удовлетворяет Ваша команда. А именно, это расширено только при закрытии кавычки, любой в начале слова (например, python ~/script.py
) или в начале переменного присвоения (например, PYTHONPATH=~/scripts python script.py
). То, что Вы имеете, --data_path=~/blabla
, который является отдельным словом в терминах оболочки, таким образом, расширение не выполняется.
непосредственная фиксация должна использовать $HOME
переменная оболочки, которая следует обычным переменным правилам расширения:
python ptb_word_lm.py --data_path=$HOME/blabla
В то время как это выполняется в:
var=~
Или
export var=~
в некоторых оболочках. Это не находится в
echo var=~
env var=~ cmd
./configure --prefix=~
в оболочках POSIX.
Это находится в bash
хотя если не в режиме соответствия POSIX (как при вызове как sh
, или когда POSIXLY_CORRECT
находится в среде):
$ bash -c 'echo a=~'
a=/home/stephane
$ POSIXLY_CORRECT= bash -c 'echo a=~'
a=~
$ SHELLOPTS=posix bash -c 'echo a=~'
a=~
$ (exec -a sh bash -c 'echo a=~')
a=~
Однако это только когда, что слева от =
формируется как неупомянутое допустимое имя переменной, поэтому в то время как оно было бы расширено в cmd prefix=~
, это не было бы в cmd --prefix=~
(как --prefix
не допустимое имя переменной), ни в cmd "p"refix=~
(из-за этого заключенный в кавычки p
) ни в var=prefix; cmd $var=~
.
В zsh
, можно установить magic_equal_subst
опция для ~
чтобы быть расширенным после, любой закрыл кавычки =
.
$ zsh -c 'echo a=~'
a=~
$ zsh -o magic_equal_subst -c 'echo a=~'
a=/home/stephane
$ zsh -o magic_equal_subst -c 'echo --a=~'
--a=/home/stephane
В случае ~
(в противоположность ~user
), можно просто использовать $HOME
вместо этого:
cmd --whatever="$HOME/whatever"
~
расширяется до значения $HOME
. Если $HOME
не установлен, поведение варьируется между оболочками. Некоторые оболочки запрашивают пользовательскую базу данных. Если бы Вы хотите принять это во внимание, Вы могли бы сделать (и это также, для чего необходимо было бы сделать ~user
):
dir=~ # or dir=~user
cmd --whatever="$dir/whatever"
В любом случае, в оболочках кроме zsh
помните, что необходимо заключить переменные расширения в кавычки!