在给出文件路径时,为什么我不能使用’〜’而不是’/ 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/... 

在您自己的代码中,您可以使用getoptargparse进行参数处理,也可以手动扩展波浪线,如@ 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