Ich kann ~
anstelle von /home/username/
auf einen Dateipfad verweisen, wenn ich zum Beispiel eine .zip
Datei entpacke .
Als ich jedoch heute den gleichen Weg ging, um ein RNN-Beispiel im Terminal auszuführen, tensorflow.python.framework.errors_impl.NotFoundError
wurde geworfen.
$ 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
Dann ersetzte ich ~
mit /home/username/
, und es funktionierte einwandfrei .
Warum konnte ich beim Ausführen eines RNN-Beispiels nicht auf den Dateipfad verweisen, ~
anstatt ihn /home/username/
zu verwenden?
Könntest du mir das genauer sagen?
command-line
bash
python
JNing
quelle
quelle
~
bevor das Argument an Python übergeben wird? Genau wie die Shell Backslash-Fluchten im Pfad erweitern oder Anführungszeichen entfernen würde, wenn der Pfad in Anführungszeichen gesetzt wurde.$VARIABLES
wird das~
nur am Anfang einer Zeichenkette erweitert.exec
) in UNIX-Tools allgemein verfügbar sein sollte .Antworten:
Sie müssen verstehen, dass dies
~
normalerweise durch die Shell erweitert wird. Die Programme, die Sie aufrufen, sehen es nie. Sie sehen den vollständigen Pfadnamen, wie er von der Bash eingefügt wurde. Dies geschieht jedoch nur, wenn die Tilde am Anfang eines Arguments steht (und nicht in Anführungszeichen steht).Wenn das von Ihnen ausgeführte Python-Programm ein Modul
getopt
zum Parsen der Befehlszeile verwendet, können Sie das Argument der--data-path
Option als separates "Wort" angeben, um die Tilde-Erweiterung zu ermöglichen:In Ihrem eigenen Code können Sie
getopt
oderargparse
für die Argumentverarbeitung verwenden und Tildes auch manuell erweitern, wie in der Antwort von @ JacobVlijm vorgeschlagen.PS. Die Tilde ist auch zu Beginn eines erweiterten Schalen variable Zuweisungsausdruck wie
DIRNAME=~/anaconda2
; Obwohl die Tilde in Ihrer Frage auch einem Gleichheitszeichen folgt, hat diese Verwendung keine besondere Bedeutung für die Shell (es ist nur etwas, das an ein Programm übergeben wird) und löst keine Erweiterung aus.quelle
getopt
, verwendenargparse
Sie , wenn Sie Python schreiben.argparse
die Antwort ergänzt, da es die Hauptalternative ist, aber ich persönlich finde es viel schwieriger zu bedienen alsgetopt
, nicht einfacher. YMMV.Tilde-Erweiterung in Python
Die Antwort ist kurz und einfach:
Python wird nur dann erweitert,
~
wenn Sie Folgendes verwenden:Siehe auch hier :
quelle
~
in der Shell-Argumentliste.Die Tilde-Erweiterung wird nur in wenigen Kontexten durchgeführt, die sich zwischen den Shells geringfügig unterscheiden .
Während es in durchgeführt wird:
Oder
in einigen Muscheln. Es ist nicht in
in POSIX-Shells.
Es ist jedoch in,
bash
wenn nicht im POSIX-Konformitätsmodus (wie beim Aufrufen alssh
oder wennPOSIXLY_CORRECT
in der Umgebung):Dies ist jedoch nur dann der
=
Fallcmd prefix=~
, wenn das, was auf der linken Seite der steht, wie ein nicht zitierter gültiger Variablenname geformt ist. Während es also in erweitert würde, würde es weder incmd --prefix=~
(wie--prefix
es kein gültiger Variablenname ist) noch incmd "p"refix=~
(aus diesem Grundp
) noch sein invar=prefix; cmd $var=~
.In
zsh
können Sie festlegen, dass diemagic_equal_subst
Option~
nach einem nicht zitierten Eintrag erweitert werden soll=
.Im Fall von
~
(im Gegensatz zu~user
) können Sie$HOME
stattdessen einfach Folgendes verwenden:~
erweitert auf den Wert von$HOME
. Wenn$HOME
nicht festgelegt, variiert das Verhalten zwischen den Shells. Einige Shells fragen die Benutzerdatenbank ab. Wenn Sie das berücksichtigen möchten, können Sie Folgendes tun (und dafür müssten Sie auch Folgendes tun~user
):In jedem Fall müssen Sie in anderen Shells als "
zsh
Denken Sie daran" variable Erweiterungen angeben!quelle
echo a=~
des Handbuchs dem Handbuch zu widersprechen scheint.~
erweitert wird (was mit "Wort" gemeint ist). Weitere Informationen finden Sie unter dem Link oben in der Antwort.~
hat bestimmte Erweiterungsregeln, die Ihr Befehl nicht erfüllt. Insbesondere wird es nur erweitert, wenn es nicht in Anführungszeichen gesetzt ist, entweder am Anfang eines Wortes (z. B.python ~/script.py
) oder am Anfang einer variablen Zuweisung (zPYTHONPATH=~/scripts python script.py
. B. ). Was Sie haben--data_path=~/blabla
, ist ein einzelnes Wort in Shell-Begriffen, so dass keine Erweiterung durchgeführt wird.Eine sofortige Lösung besteht darin, eine
$HOME
Shell-Variable zu verwenden, die den regulären Regeln für die Variablenerweiterung folgt:quelle
PATH=$PATH:~/bin
. Auch das$HOME
muss in Anführungszeichen gesetzt werden oder split + glob gilt in anderen Shells alszsh
.bash
manuellen Zustände in demTilde Expansion
Abschnitt vorliegen. +1[link](/a/146697)
dass ich nicht realisiert habe, dass wir hier auf einer anderen Site waren. Der Link sollte dort sein