Я могу использовать ~
вместо /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/
, и все заработало нормально.
Почему я не могу использовать ~
вместо /home/username/
указания пути к файлу при запуске примера RNN?
Не могли бы вы рассказать мне подробнее?
command-line
bash
python
JNing
источник
источник
~
перед передачей аргумента в python? Точно так же, как оболочка расширила бы обратный слеш в пути или удалила кавычки, если путь был заключен в кавычки.$VARIABLES
,~
раскрывается только в начале строки.exec
«г) должна быть широко доступна в инструментах UNIX ,Ответы:
Вы должны понимать, что
~
обычно расширяется оболочкой; программы, которые вы вызываете, никогда не видят его, они видят полный путь, вставленный bash. Но это происходит только тогда, когда тильда находится в начале аргумента (и не заключена в кавычки).Если программа Python, которую вы запускаете, использует модуль, подобный
getopt
синтаксическому анализу своей командной строки, вы можете задать аргумент--data-path
опции в виде отдельного слова, чтобы разрешить расширение тильды:В вашем собственном коде вы можете использовать
getopt
илиargparse
для обработки аргументов, а также можете вручную развернуть тильды, как подсказывает ответ @ JacobVlijm.PS. Тильда также раскрывается в начале выражения присваивания переменной оболочки, подобного
DIRNAME=~/anaconda2
; хотя тильда в вашем вопросе также следует за знаком равенства, это использование не имеет особого значения для оболочки (это просто что-то, переданное программе) и не вызывает расширения.источник
getopt
, используйте,argparse
если вы пишете Python.argparse
к ответу, так как это основная альтернатива, но лично я нахожу его гораздо сложнее, чемgetopt
, а не проще. YMMV.Расширение тильды в питоне
Ответ короткий и простой:
Python не расширяется,
~
если вы не используете:Смотрите также здесь :
источник
~
в списке аргументов оболочки.Расширение тильды выполняется только в нескольких контекстах, которые слегка различаются между оболочками .
Пока это выполняется в:
Или
в некоторых снарядах. Это не в
в оболочках POSIX.
bash
Хотя он находится не в режиме соответствия POSIX (напримерsh
, когдаPOSIXLY_CORRECT
вызывается как или когда находится в среде):Однако это происходит только тогда, когда то, что находится слева от
=
формы, имеет форму имени действительной переменной без кавычек, поэтому, хотя оно будет расширеноcmd prefix=~
, оно не будет ни вcmd --prefix=~
(как--prefix
не допустимое имя переменной), ни вcmd "p"refix=~
(из-за этого в кавычкахp
), ни в вvar=prefix; cmd $var=~
.В
zsh
, вы можете установитьmagic_equal_subst
параметр для~
расширения после любого без кавычек=
.В случае
~
(в отличие от~user
) вы можете просто использовать$HOME
вместо:~
расширяется до значения$HOME
. Если$HOME
не установлено, поведение меняется между оболочками. Некоторые оболочки запрашивают базу данных пользователей. Если вы хотите принять это во внимание, вы можете сделать (и это также то, что вы должны были бы сделать~user
):В любом случае, в других оболочках, кроме
zsh
запоминания, нужно указывать расширения переменных!источник
echo a=~
противоречит руководству.~
будет расширен (что означает «слово»). Смотрите ссылку в верхней части ответа для более подробной информации.~
имеет определенные правила расширения, которые не удовлетворяет ваша команда. В частности, оно раскрывается только без кавычек, либо в начале слова (напримерpython ~/script.py
), либо в начале присвоения переменной (напримерPYTHONPATH=~/scripts python script.py
). То, что у вас есть,--data_path=~/blabla
это одно слово в терминах оболочки, поэтому расширение не выполняется.Немедленное решение - использовать
$HOME
переменную оболочки, которая следует обычным правилам расширения переменных:источник
PATH=$PATH:~/bin
. Кроме того, это$HOME
должно быть заключено в кавычки или split + glob применяется в других оболочках, кромеzsh
.bash
руководства вTilde Expansion
разделе. +1[link](/a/146697)
что даже не осознавал, что мы здесь на другом сайте. Ссылка должна быть там