Posso usar em ~
vez de /home/username/
apontar para um caminho de arquivo quando, por exemplo, descompactar um .zip
arquivo.
No entanto, hoje, quando segui o mesmo caminho para executar um exemplo da RNN no terminal, tensorflow.python.framework.errors_impl.NotFoundError
foi lançado.
$ 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
Então eu substituí ~
por /home/username/
, e funcionou corretamente.
Por que eu não poderia usar ~
, em vez de /home/username/
para apontar para o caminho do arquivo quando runing um exemplo RNN?
Você poderia me contar em detalhes?
command-line
bash
python
JNing
fonte
fonte
~
antes de o argumento ser passado para python? Assim como o shell expandiria escapes de barra invertida no caminho ou removeria aspas se o caminho fosse citado.$VARIABLES
, o~
somente é expandido no início de uma string.exec
'd) deve estar amplamente disponível em ferramentas UNIX .Respostas:
Você precisa entender que
~
normalmente é expandido pelo shell; os programas que você chama nunca o veem, eles veem o nome do caminho completo conforme inserido pelo bash. Mas isso só acontece quando o til está no início de um argumento (e não é citado).Se o programa Python que você está executando usa um módulo como
getopt
para analisar sua linha de comando, você pode fornecer o argumento da--data-path
opção como uma "palavra" separada para permitir a expansão do til:No seu próprio código, você pode usar
getopt
ouargparse
para o processamento de argumentos e também pode expandir manualmente os tildes, como sugeriu a resposta de @ JacobVlijm.PS. O til também é expandido no início de uma expressão de atribuição de variável do shell como
DIRNAME=~/anaconda2
; embora o til na sua pergunta também siga um sinal de igual, esse uso não tem um significado especial para o shell (é apenas algo passado para um programa) e não aciona a expansão.fonte
getopt
, useargparse
se estiver escrevendo Python.argparse
a resposta, já que é a principal alternativa, mas pessoalmente acho muito mais difícil de usar do quegetopt
não é mais fácil. YMMV.Expansão til em python
A resposta é curta e simples:
python não se expande a
~
menos que você use:Veja também aqui :
fonte
~
na lista de argumentos do shell.A expansão do til é feita apenas em alguns contextos que variam ligeiramente entre as conchas .
Enquanto é realizado em:
Ou
em algumas conchas. Não está em
em cartuchos POSIX.
É no
bash
entanto, quando não está no modo de conformidade POSIX (como quando chamado comosh
ou quandoPOSIXLY_CORRECT
está no ambiente):No entanto, é somente quando o que está à esquerda do
=
é modelado como um nome de variável válido não citado, portanto, embora ele fosse expandidocmd prefix=~
, ele não estariacmd --prefix=~
(como--prefix
não é um nome de variável válido) nem emcmd "p"refix=~
(por causa do citadop
) nem novar=prefix; cmd $var=~
.Em
zsh
, você pode definir amagic_equal_subst
opção~
a ser expandida após qualquer aspas=
.No caso de
~
(ao contrário de~user
), você pode apenas usar$HOME
:~
expande para o valor de$HOME
. Se$HOME
não estiver definido, o comportamento varia entre as conchas. Algumas conchas consultam o banco de dados do usuário. Se você quiser levar isso em conta, poderá fazer (e é também isso que você precisaria fazer~user
):Em qualquer caso, em conchas que não sejam
zsh
lembradas, é necessário citar expansões variáveis!fonte
echo a=~
parece contradizer o manual.~
será expandido (o que se entende por "palavra"). Veja o link na parte superior da resposta para mais detalhes.~
possui regras de expansão específicas, que seu comando não atende. Especificamente, ele é expandido apenas quando não está entre aspas, no início de uma palavra (por exemplopython ~/script.py
) ou no início de uma atribuição de variável (por exemploPYTHONPATH=~/scripts python script.py
). O que você tem é--data_path=~/blabla
qual é uma única palavra em termos de shell, para que a expansão não seja realizada.Uma correção imediata é usar a
$HOME
variável shell, que segue regras regulares de expansão de variáveis:fonte
PATH=$PATH:~/bin
. Também isso$HOME
precisa ser citado ou split + glob se aplica a conchas diferentes dezsh
.bash
estados do manual naTilde Expansion
seção. 1[link](/a/146697)
não percebi que estávamos em um site diferente aqui. O link deve estar lá