如何将带有冒号的目录添加到PYTHONPATH?

7
问题很简单:
使用bash,我想为了方便脚本执行将一个目录添加到我的PYTHONPATH中。不幸的是,我想使用的目录中有一个冒号。因此,我尝试了以下每个命令:
export PYTHONPATH=${PYTHONPATH}:/home/shane/mywebsite.com:3344/
export PYTHONPATH=${PYTHONPATH}:/home/shane/mywebsite.com\:3344/
export PYTHONPATH=${PYTHONPATH}:"/home/shane/mywebsite.com:3344/"

这些方法都无法奏效。每次在Python中创建路径时,都会将路径作为两个独立的目录添加到路径中。 我的问题是,是否可以在Bash中实现这个功能? 如果可以,需要什么语法?


8
为什么不直接将文件夹重命名,用其他符号替换冒号呢?或者干脆将其去掉? - OJ.
1
@OJ:非常好的问题!我希望能够点赞评论。 - S.Lott
@S.Lott 讽刺啊 :) 是你要求对评论点赞的吗? - orokusaki
6个回答

11
问题不在于bash。它应该正确设置你的环境变量,包括冒号(:)字符。
问题实际上出在Python解析PYTHONPATH变量上。遵循路径变量(PATH variable)的例子,似乎没有任何转义字符可用,因此无法让它将:解释为分隔符以外的其他内容。你可以从Python解释器源代码中自行查看。
唯一的解决方法就是像一些人已经提到的那样,使用符号链接或其他方法来允许你为目录设置没有冒号的名称。

3
这是 Python 中的一个程序错误:有一个特殊字符无法被转义。 - Svante
1
@Harleqin:所以你不知道什么是 bug 吗:它是指不能按照规范的要求正常运作的东西。 - tzot

3

原帖中的问题是将带有端口号的URL添加到文件路径列表中。这种类型的URL不是文件路径,因此Python无法在该位置找到Python文件。将具有端口号的URL放入PYTHONPATH中是没有意义的。

但是,一些人可能会因以下原因而进入此问题:

在Windows上,路径具有驱动器标识符后跟一个冒号,例如C:/Python27/lib。在Windows上的Bash中,您可以使用分号像这样将多个路径添加到PYTHONPATH中:

$ export PYTHONPATH="C:\MYPATH1;C:\MYPATH2"
$ python -i
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', 'C:\\MYPATH1', 'C:\\MYPATH2', 'C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages', 'C:\\Python27\\lib\\site-packages\\win32', 'C:\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\Python27\\lib\\site-packages\\Pythonwin']

2

你还没有尝试的只有一个:

export PYTHONPATH=${PYTHONPATH}:"/home/shane/mywebsite.com\:3344/"

问题在于没有加引号时,转义字符直接被解释成字符串中的字面 ":",但是后面需要对":"进行求值。
$ echo "foo:" 
foo:
$ echo \:foo
:foo
$ echo ":foo"
:foo
$ echo "\:foo"
\:foo

我不能保证这样做能够解决你的python-path问题,但它会将\符号插入到字符串中。


1

我不确定你想要的是否直接可行,但如果你正在使用Linux文件系统,一个解决方法是创建一个符号链接到你的“冒号”目录,并像这样将此符号链接添加到你的PYTHONPATH中:

ln -s /home/shane/mywebsite.com\:3344 /home/shane/mywebsite.3344
export PYTHONPATH=${PYTHONPATH}:/home/shane/mywebsite.3344

0

符号链接 hack 可能是唯一可行的选项,除非有一些启发式方法来确定如何处理 PYTHONPATH 中的冒号。


0
在目录名称中不要包含分号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接