Mogę użyć ~
zamiast /home/username/
wskazywać ścieżkę do pliku, na przykład podczas rozpakowywania .zip
pliku.
Jednak dzisiaj, gdy poszedłem w ten sam sposób, aby uruchomić przykład RNN w terminalu, tensorflow.python.framework.errors_impl.NotFoundError
został rzucony.
$ 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
Wtedy otrzymuje ~
się /home/username/
, i to działało poprawnie.
Dlaczego nie mogę użyć ~
zamiast /home/username/
wskazywać ścieżki pliku podczas uruchamiania przykładu RNN?
Czy mógłbyś mi szczegółowo powiedzieć?
command-line
bash
python
JNing
źródło
źródło
~
przed przekazaniem argumentu do Pythona? Podobnie jak powłoka rozwijałaby ucieczki ukośnika odwrotnego na ścieżce lub usuwała cudzysłowy, jeśli ścieżka była cytowana.$VARIABLES
tego~
jest rozwinięty tylko na początku łańcucha.exec
d) powinna być szeroko dostępna w narzędziach UNIX .Odpowiedzi:
Musisz zrozumieć, że
~
zwykle jest rozszerzany przez powłokę; programy, które wywołujesz, nigdy tego nie widzą, widzą pełną nazwę ścieżki wstawioną przez bash. Ale dzieje się tak tylko wtedy, gdy tylda jest na początku argumentu (i nie jest cytowana).Jeśli uruchomiony program Python używa modułu takiego jak
getopt
parsowanie wiersza poleceń, możesz podać argument--data-path
opcji jako osobne „słowo”, aby umożliwić rozwinięcie tyldy:W swoim własnym kodzie możesz używać
getopt
lubargparse
do przetwarzania argumentów, a także możesz ręcznie rozwijać tyldy, jak sugeruje odpowiedź @ JacobVlijm.PS. Tylda jest także rozszerzona na początku powłoki przypisania ekspresji zmiennej jak
DIRNAME=~/anaconda2
; chociaż tylda w twoim pytaniu również występuje po znaku równości, to użycie nie ma specjalnego znaczenia dla powłoki (jest to po prostu coś przekazywanego do programu) i nie powoduje rozszerzenia.źródło
getopt
, użyj,argparse
jeśli piszesz w języku Python.argparse
do odpowiedzi, ponieważ jest to główna alternatywa, ale osobiście uważam, że jest znacznie trudniejsza w użyciu niżgetopt
wcale nie jest łatwiejsza. YMMV.Rozszerzenie tyldy w pythonie
Odpowiedź jest krótka i prosta:
Python nie rozwija się,
~
chyba że użyjesz:Zobacz także tutaj :
źródło
~
na liście argumentów powłoki.Rozbudowa tyldy odbywa się tylko w kilku kontekstach, które różnią się nieznacznie między powłokami .
Podczas gdy jest wykonywany w:
Lub
w niektórych muszlach. Nie ma go
w powłokach POSIX.
Dzieje się tak,
bash
gdy nie jest w trybie zgodności z POSIX (np. Gdy jest wywoływany jakosh
lub gdyPOSIXLY_CORRECT
znajduje się w środowisku):Jednak tylko wtedy, gdy to, co znajduje się po lewej stronie
=
jest ukształtowane jak niecytowana poprawna nazwa zmiennej, więc chociaż będzie ona rozwiniętacmd prefix=~
, nie będzie wcmd --prefix=~
(ponieważ--prefix
nie jest prawidłową nazwą zmiennej) ani wcmd "p"refix=~
(z powodu tego cytowanegop
) ani wvar=prefix; cmd $var=~
.W
zsh
polu możesz ustawićmagic_equal_subst
opcję~
rozwijania po każdym nie cytowanym=
.W przypadku
~
(w przeciwieństwie do~user
) możesz po prostu użyć$HOME
zamiast tego:~
rozwija się do wartości$HOME
. Jeśli$HOME
nie jest ustawiony, zachowanie różni się między powłokami. Niektóre powłoki wykonują zapytania do bazy danych użytkowników. Jeśli chcesz to wziąć pod uwagę, możesz zrobić (i to też musisz zrobić~user
):W każdym razie, w powłokach innych niż
zsh
pamiętaj, musisz cytować zmienne rozszerzenia!źródło
echo a=~
wydaje się być sprzeczne z instrukcją.~
zostanie rozwinięty (co oznacza „słowo”). Zobacz link u góry odpowiedzi, aby uzyskać więcej informacji.~
ma określone reguły rozszerzania, których twoje polecenie nie spełnia. W szczególności jest rozszerzany tylko wtedy, gdy nie jest cytowany, ani na początku słowa (np.python ~/script.py
) , Ani na początku przypisania zmiennej (npPYTHONPATH=~/scripts python script.py
.). To, co masz, jest--data_path=~/blabla
pojedynczym słowem w terminologii powłoki, więc ekspansja nie jest wykonywana.Natychmiastową poprawką jest użycie
$HOME
zmiennej powłoki, która jest zgodna ze zwykłymi regułami rozszerzania zmiennych:źródło
PATH=$PATH:~/bin
. Również to$HOME
musi być cytowane lub podzielone + glob ma zastosowanie w powłokach innych niżzsh
.bash
stanowi instrukcja w tejTilde Expansion
sekcji. +1[link](/a/146697)
, że nie zdawałem sobie sprawy, że jesteśmy tutaj na innej stronie. Link powinien być tam