Puedo usar en ~
lugar de /home/username/
señalar una ruta de archivo cuando, por ejemplo, descomprima un .zip
archivo.
Sin embargo, hoy, cuando seguí el mismo camino para ejecutar un ejemplo RNN en la terminal, me tensorflow.python.framework.errors_impl.NotFoundError
arrojaron.
$ 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
Luego reemplacé ~
con /home/username/
, y funcionó correctamente.
¿Por qué no podría usar en ~
lugar de /home/username/
señalar la ruta del archivo al ejecutar un ejemplo RNN?
¿Podrías decirme en detalle?
command-line
bash
python
JNing
fuente
fuente
~
antes de pasar el argumento a Python? Al igual que el shell expandiría los escapes de barra invertida en la ruta, o eliminaría las comillas si la ruta fuera entrecomillada.$VARIABLES
, el~
solo se expande al comienzo de una cadena.exec
'd) debería estar ampliamente disponible en las herramientas UNIX .Respuestas:
Debe comprender que
~
normalmente se expande por el shell; los programas a los que llama nunca lo ven, ven el nombre de ruta completo como insertado por bash. Pero esto solo sucede cuando la tilde está al comienzo de un argumento (y no se cita).Si el programa Python que está ejecutando usa un módulo como
getopt
analizar su línea de comandos, puede dar el argumento de la--data-path
opción como una "palabra" separada para permitir la expansión de tilde:En su propio código, puede utilizar
getopt
oargparse
para el procesamiento de argumento, y también se puede ampliar de forma manual tildes como respuesta de @ JacobVlijm sugerido.PD. La tilde también se expande al comienzo de una expresión de asignación de variable de shell como
DIRNAME=~/anaconda2
; Aunque la tilde en su pregunta también sigue un signo de igual, este uso no tiene un significado especial para el shell (es solo algo que se pasa a un programa) y no desencadena la expansión.fuente
getopt
, úsaloargparse
si estás escribiendo Python.argparse
la respuesta ya que es la alternativa principal, pero personalmente me resulta mucho más difícil de usar quegetopt
, no es más fácil. YMMV.Expansión de Tilde en Python
La respuesta es corta y simple:
Python no se expande a
~
menos que use:Ver también aquí :
fuente
~
en la lista de argumentos de shell.La expansión de Tilde solo se realiza en unos pocos contextos que varían ligeramente entre conchas .
Mientras se realiza en:
O
En algunas conchas. No esta en
en conchas POSIX.
Sin
bash
embargo, es cuando no está en modo de conformidad POSIX (como cuando se llama comosh
o cuandoPOSIXLY_CORRECT
está en el entorno):Sin embargo, eso es solo cuando lo que está a la izquierda del
=
tiene la forma de un nombre de variable válido sin comillas, por lo que si bien se expandiría encmd prefix=~
, no estaría encmd --prefix=~
(como--prefix
no es un nombre de variable válido) ni encmd "p"refix=~
(debido a eso citadop
) ni envar=prefix; cmd $var=~
.En
zsh
, puede configurar lamagic_equal_subst
opción para~
que se expanda después de cualquier sin comillas=
.En el caso de
~
(en lugar de~user
), puede usar$HOME
en su lugar:~
se expande al valor de$HOME
. Si$HOME
no se establece, el comportamiento varía entre los depósitos. Algunos shells consultan la base de datos del usuario. Si desea tener eso en cuenta, puede hacer (y eso es también lo que tendría que hacer~user
):En cualquier caso, en otros shells que no sean
zsh
recordados, ¡necesita cotizar expansiones variables!fuente
echo a=~
parece contradecir el manual.~
se expandirá (qué se entiende por "palabra"). Vea el enlace en la parte superior de la respuesta para más detalles.~
tiene reglas de expansión particulares, que su comando no satisface. Específicamente, se expande solo cuando no se cita, ya sea al comienzo de una palabra (por ejemplopython ~/script.py
) o al comienzo de una asignación variable (por ejemploPYTHONPATH=~/scripts python script.py
). Lo que tiene es--data_path=~/blabla
una sola palabra en términos de shell, por lo que no se realiza la expansión.Una solución inmediata es usar la
$HOME
variable de shell, que sigue las reglas regulares de expansión de variables:fuente
PATH=$PATH:~/bin
. También eso$HOME
necesita ser citado o split + glob se aplica en conchas que no seanzsh
.bash
que dice el manual en laTilde Expansion
sección. +1[link](/a/146697)
que no me di cuenta de que estábamos en un sitio diferente aquí. El enlace debería estar allí