Je peux utiliser ~
au lieu de /home/username/
pointer sur un chemin de fichier lorsque, par exemple, décompresser un .zip
fichier.
Cependant, aujourd’hui, lorsque j’ai suivi la même procédure pour exécuter un exemple RNN en terminal, cela a tensorflow.python.framework.errors_impl.NotFoundError
été jeté.
$ 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
Ensuite, j'ai remplacé ~
par /home/username/
, et cela a fonctionné correctement.
Pourquoi est-ce que je ne pouvais pas utiliser ~
au lieu de /home/username/
pointer sur le chemin du fichier lors de l'exécution d'un exemple RNN?
Pourriez-vous me dire en détail?
command-line
bash
python
JNing
la source
la source
~
avant que l'argument ne soit passé à python? Tout comme le shell développerait les barres obliques inverses dans le chemin, ou supprimerait les guillemets si le chemin était cité.$VARIABLES
, le~
n'est développé qu'au début d'une chaîne.exec
« d) devrait être largement disponible dans les outils UNIX .Réponses:
Vous devez comprendre que cela
~
est normalement développé par le shell; les programmes que vous appelez ne le voient jamais, ils voient le nom de chemin complet inséré par bash. Mais cela ne se produit que lorsque le tilde est au début d'un argument (et n'est pas cité).Si le programme Python que vous exécutez utilise un module similaire
getopt
à celui de l'analyse de la ligne de commande, vous pouvez définir l'argument de l'--data-path
option sous la forme d'un "mot" distinct pour permettre le développement du tilde:Dans votre propre code, vous pouvez utiliser
getopt
ouargparse
pour le traitement des arguments, et également développer manuellement les tildes, comme le suggère la réponse de @ JacobVlijm.PS Le tilde est également développé au début d’une expression d’affectation de variable shell telle que
DIRNAME=~/anaconda2
; bien que le tilde de votre question suive également un signe égal, cet usage n'a pas de signification particulière pour le shell (il s'agit simplement d'un élément transmis à un programme) et ne déclenche pas d'expansion.la source
getopt
déjà, utilisez-leargparse
si vous écrivez en Python.argparse
à la réponse car c'est l'alternative principale, mais personnellement, je trouve qu'il est beaucoup plus difficile à utiliser quegetopt
, pas plus facile. YMMV.Expansion de tilde en python
La réponse est courte et simple:
Python ne se développe pas
~
sauf si vous utilisez:Voir aussi ici :
la source
~
dans la liste d'arguments shell.L'expansion de tilde n'est effectuée que dans quelques contextes qui varient légèrement d'un shell à l'autre .
Bien qu'il soit exécuté en:
Ou
dans certains coquillages. Ce n'est pas dans
dans des coquilles POSIX.
Il est dans
bash
cependant si pas en mode de conformité POSIX (comme quand appelésh
, ou quandPOSIXLY_CORRECT
est dans l'environnement):Quoi qu'il en est seulement quand ce qui est à gauche de l'
=
est en forme comme un unquoted nom de variable valide, si bien qu'il serait élargi encmd prefix=~
, il ne serait pascmd --prefix=~
(comme--prefix
n'est pas un nom de variable valide) nicmd "p"refix=~
( à cause de cette citép
) , ni dansvar=prefix; cmd $var=~
.Dans
zsh
, vous pouvez définir l'magic_equal_subst
option~
à développer après tout non cité=
.Dans le cas de
~
(par opposition à~user
), vous pouvez simplement utiliser$HOME
:~
se développe à la valeur de$HOME
. Si$HOME
n'est pas défini, le comportement varie d'un shell à l'autre. Certains shells interrogent la base de données utilisateur. Si vous voulez en tenir compte, vous pouvez faire (et c'est aussi ce que vous devez faire~user
):Dans tous les cas, dans les coques autres que celles
zsh
utilisées, rappelez-vous qu'il vous faut citer des extensions variables!la source
echo a=~
semble contredire le manuel.~
sera développé (ce que l’on entend par "mot"). Voir le lien en haut de la réponse pour plus de détails.~
a des règles d'expansion particulières, auxquelles votre commande ne satisfait pas. Plus précisément, il est développé uniquement lorsqu'il est non mis entre guillemets, soit au début d'un mot (par exemplepython ~/script.py
), soit au début d'une affectation de variable (par exemplePYTHONPATH=~/scripts python script.py
). Ce que vous avez est--data_path=~/blabla
ce qui est un mot simple en termes de shell, de sorte que l'expansion n'est pas effectuée.Une solution immédiate consiste à utiliser une
$HOME
variable shell, qui suit les règles habituelles de développement des variables:la source
PATH=$PATH:~/bin
. De plus, il$HOME
faut citer ou scinder + glob s'applique dans les shells autres quezsh
.bash
manuel dans laTilde Expansion
section. +1[link](/a/146697)
je ne savais pas que nous étions sur un site différent ici. Le lien devrait être là