在给出文件路径时,为什么我不能使用’〜’而不是’/ home / username /’
我可以使用~
而不是/home/username/
指向文件路径,例如解压缩.zip
文件。
但是,今天当我按照相同的方式在终端中运行RNN示例时,抛出了tensorflow.python.framework.errors_impl.NotFoundError
。
$ 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 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", "").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
然后我用/home/username/
替换了~
,它运行正常。
为什么我不能在运行RNN示例时使用~
而不是/home/username/
指向文件路径?
你能详细告诉我一下吗?
您需要了解~
通常由shell扩展; 你调用的程序永远不会看到它,它们会看到bash插入的完整路径名。 但这只发生在波浪号在参数开始时(并且没有引用)。
如果您运行的Python程序使用像getopt
这样的模块来解析其命令行,您可以将--data-path
选项的参数作为单独的“单词”来允许波形扩展:
$ python ptb_word_lm.py --data_path ~/anaconda2/lib/python2.7/...
在您自己的代码中,您可以使用getopt
或argparse
进行参数处理,也可以手动扩展波浪线,如@ JacobVlijm的答案所示。
PS。 tilde也在shell变量赋值表达式的开头展开,如DIRNAME=~/anaconda2
; 虽然你的问题中的波浪号也遵循等号,但这种用法对shell没有特殊意义(它只是传递给程序的东西)并且不会触发扩展。
python中的Tilde扩展
答案简短而简单:
python不会扩展~
除非你使用:
import os os.path.expanduser('~/your_directory')
另见:
os.path.expanduser(路径)
在Unix和Windows上,返回带有〜或〜用户主目录替换的初始组件的参数。在Unix上,如果设置了初始〜,则由环境变量HOME替换; 否则,通过内置模块pwd在密码目录中查找当前用户的主目录。 直接在密码目录中查找初始〜用户。
Tilde扩展仅在壳体之间略有不同的几种情况下完成 。
虽然它是在:
var=~
要么
export var=~
在一些炮弹。 它不在
echo var=~ env var=~ cmd ./configure --prefix=~
在POSIX shell中。
虽然不在POSIX一致性模式下(比如当被称为sh
,或者当POSIXLY_CORRECT
在环境中时),它在bash
:
$ bash -c 'echo a=~' a=/home/stephane $ POSIXLY_CORRECT= bash -c 'echo a=~' a=~ $ SHELLOPTS=posix bash -c 'echo a=~' a=~ $ (exec -a sh bash -c 'echo a=~') a=~
然而,只有在=
左边的内容形状像一个不带引号的有效变量名称时,所以虽然它会在cmd prefix=~
扩展,但它不会在cmd --prefix=~
(因为--prefix
不是一个有效的变量名称)也不在cmd "p"refix=~
(因为引用的p
),也不在var=prefix; cmd $var=~
var=prefix; cmd $var=~
。
在zsh
,您可以设置~
的magic_equal_subst
选项,以便在任何未引用的=
之后进行扩展。
$ zsh -c 'echo a=~' a=~ $ zsh -o magic_equal_subst -c 'echo a=~' a=/home/stephane $ zsh -o magic_equal_subst -c 'echo --a=~' --a=/home/stephane
在~
(与~user
相对)的情况下,您可以使用$HOME
代替:
cmd --whatever="$HOME/whatever"
~
扩展到$HOME
的值。 如果未设置$HOME
则shell之间的行为会有所不同。 一些shell查询用户数据库。 如果你想考虑到这一点,你可以做(这也是你要为~user
做的事情):
dir=~ # or dir=~user cmd --whatever="$dir/whatever"
在任何情况下,在zsh
以外的shell中记住你需要引用变量扩展!
~
有特定的扩展规则,你的命令不满足。 具体来说,它只在未加引号时扩展,可以在单词的开头(例如python ~/script.py
)或变量赋值的开头(例如PYTHONPATH=~/scripts python script.py
)。 你所拥有的是--data_path=~/blabla
,它是shell术语中的单个单词,因此不执行扩展。
立即修复是使用$HOME
shell变量,它遵循常规变量扩展规则:
python ptb_word_lm.py --data_path=$HOME/blabla