Почему я не мог использовать '~' вместо '/home/username/' при предоставлении пути к файлу

Я могу использовать ~ вместо /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?

Вы могли сказать мне подробно?

43
задан 9 March 2017 в 13:31

4 ответа

Необходимо понять, что ~ обычно расширяется оболочкой; программы, которые Вы называете, никогда не видят его, они видят полный путь, как вставлено ударом. Но это только происходит, когда тильда в начале аргумента (и не заключается в кавычки).

, Если программа Python Вы работаете, использует модуль как getopt для парсинга его командной строки, можно дать аргумент --data-path опция как отдельное "слово" для разрешения расширения тильды:

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

В Вашем собственном коде, Вы можете использовать getopt или argparse для обработки аргумента и могли также вручную развернуть тильды как предложенный ответ @JacobVlijm.

пз. Тильда также расширена в начале оболочка переменное выражение присваивания как DIRNAME=~/anaconda2; хотя тильда в Вашем вопросе также следует, равняется знаку, это использование не имеет особого значения для оболочки (это просто, что-то передало программе), и не инициировал расширение.

45
ответ дан 23 November 2019 в 00:00

Расширение тильды в python

ответ является коротким & простой:

Python не расширяется ~, если Вы не используете:

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

См. также здесь :

os.path.expanduser (путь)
На Unix и Windows, возвратите спор с начальным компонентом ~ или ~user, замененного этим user‘s корневой каталог.

На Unix, начальная буква ~ заменяется переменной среды ДОМОЙ, если это установлено; иначе текущий user’s корневой каталог ищется в каталоге пароля через встроенный модуль pwd. Начальная буква ~user ищется непосредственно в каталоге пароля.

33
ответ дан 23 November 2019 в 00:00

~ имеет конкретные правила расширения, которые не удовлетворяет Ваша команда. А именно, это расширено только при закрытии кавычки, любой в начале слова (например, python ~/script.py) или в начале переменного присвоения (например, PYTHONPATH=~/scripts python script.py). То, что Вы имеете, --data_path=~/blabla, который является отдельным словом в терминах оболочки, таким образом, расширение не выполняется.

непосредственная фиксация должна использовать $HOME переменная оболочки, которая следует обычным переменным правилам расширения:

python ptb_word_lm.py --data_path=$HOME/blabla
6
ответ дан 23 November 2019 в 00:00

Расширение тильды только сделано в нескольких контекстах, которые варьируются немного между оболочками.

В то время как это выполняется в:

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 помните, что необходимо заключить переменные расширения в кавычки!

12
ответ дан 23 November 2019 в 00:00

Другие вопросы по тегам:

Похожие вопросы: