Saya bisa menggunakan ~
alih-alih /home/username/
menunjuk ke jalur file ketika, misalnya, membuka ritsleting .zip
file.
Namun, hari ini ketika saya mengikuti cara yang sama untuk menjalankan contoh RNN di terminal, tensorflow.python.framework.errors_impl.NotFoundError
terlempar.
$ 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
Lalu saya ganti ~
dengan /home/username/
, dan itu berfungsi dengan baik.
Mengapa saya tidak bisa menggunakan ~
alih-alih /home/username/
menunjuk ke jalur file ketika menjalankan contoh RNN?
Bisakah Anda memberi tahu saya secara detail?
command-line
bash
python
JNing
sumber
sumber
~
sebelum argumen dilewatkan ke python? Sama seperti shell akan memperluas backslash lolos di jalan, atau menghapus tanda kutip jika jalan itu dikutip.$VARIABLES
,~
hanya diperluas pada awal string.exec
'd) harus tersedia secara luas di alat UNIX .Jawaban:
Anda perlu memahami bahwa
~
biasanya diperluas oleh shell; program yang Anda panggil tidak pernah melihatnya, mereka melihat nama path lengkap seperti yang dimasukkan oleh bash. Tapi ini hanya terjadi ketika tilde berada di awal argumen (dan tidak dikutip).Jika program Python yang Anda jalankan menggunakan modul yang ingin
getopt
mem-parsing commandline-nya, Anda bisa memberikan argumen--data-path
opsi sebagai "kata" terpisah untuk memungkinkan ekspansi tilde:Dalam kode Anda sendiri, Anda dapat menggunakan
getopt
atauargparse
untuk pemrosesan argumen, dan juga bisa secara manual memperluas tildes seperti yang disarankan oleh jawaban @ JacobVlijm.PS. Tilde juga diperluas pada awal ekspresi penugasan variabel shell seperti
DIRNAME=~/anaconda2
; meskipun tilde dalam pertanyaan Anda juga mengikuti tanda sama dengan, penggunaan ini tidak memiliki arti khusus untuk shell (itu hanya sesuatu yang diteruskan ke program) dan tidak memicu ekspansi.sumber
getopt
, gunakanargparse
jika Anda sedang menulis Python.argparse
jawaban karena itu adalah alternatif utama, tetapi secara pribadi saya merasa lebih sulit untuk digunakan daripadagetopt
, tidak mudah. YMMV.Ekspansi Tilde dalam python
Jawabannya singkat & sederhana:
python tidak berkembang
~
kecuali jika Anda menggunakan:Lihat juga di sini :
sumber
~
dalam daftar argumen shell.Perluasan Tilde hanya dilakukan dalam beberapa konteks yang sedikit berbeda antar shell .
Sementara itu dilakukan di:
Atau
di beberapa kerang. Itu tidak ada
dalam kulit POSIX.
Hal ini dalam
bash
meskipun ketika tidak dalam modus kesesuaian POSIX (seperti ketika disebut sebagaish
, atau ketikaPOSIXLY_CORRECT
berada di lingkungan):Namun itu hanya ketika apa yang ada di sebelah kiri
=
berbentuk seperti nama variabel valid yang tidak dikutip , jadi sementara itu akan diperluascmd prefix=~
, itu tidak akan menjadicmd --prefix=~
(karena--prefix
bukan nama variabel yang valid) atau dicmd "p"refix=~
(karena yang dikutipp
) atau divar=prefix; cmd $var=~
.Di
zsh
, Anda dapat mengaturmagic_equal_subst
opsi untuk~
diperluas setelah tanda kutip=
.Dalam hal
~
(sebagai lawan dari~user
), Anda bisa menggunakan$HOME
saja:~
memperluas ke nilai$HOME
. Jika$HOME
tidak disetel, perilaku bervariasi antar shell. Beberapa shell meminta database pengguna. Jika Anda ingin memperhitungkannya, Anda dapat melakukannya (dan itulah yang harus Anda lakukan untuk~user
):Bagaimanapun, dalam cangkang selain
zsh
ingat Anda perlu mengutip ekspansi variabel!sumber
echo a=~
tampaknya bertentangan dengan manual.~
akan diperluas (apa yang dimaksud dengan "kata"). Lihat tautan di bagian atas jawaban untuk perincian lebih lanjut.~
memiliki aturan ekspansi tertentu, yang tidak dipenuhi perintah Anda. Secara khusus, itu diperluas hanya ketika tanda kutip, baik di awal kata (misalnyapython ~/script.py
) atau di awal penugasan variabel (misalnyaPYTHONPATH=~/scripts python script.py
). Apa yang Anda miliki adalah--data_path=~/blabla
satu kata dalam istilah shell, jadi ekspansi tidak dilakukan.Perbaikan segera adalah dengan menggunakan
$HOME
variabel shell, yang mengikuti aturan ekspansi variabel reguler:sumber
PATH=$PATH:~/bin
. Juga yang$HOME
perlu dikutip atau dibelah + glob berlaku di shell selainzsh
.bash
dinyatakan secara manual diTilde Expansion
bagian ini. +1[link](/a/146697)
saya tidak menyadari kami berada di situs yang berbeda di sini.