open()找不到相对于PYTHONPATH的给定路径的文件
我确实导出了PYTHONPATH=$PYTHONPATH:/home/User/folder/test。然后我在/home/User/中运行python并检查sys.path——这是正确的open()找不到相对于PYTHONPATH的给定路径的文件,python,ubuntu,path,Python,Ubuntu,Path,我确实导出了PYTHONPATH=$PYTHONPATH:/home/User/folder/test。然后我在/home/User/中运行python并检查sys.path——这是正确的 >>> import sys >>> sys.path ['', '/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg', '/home/User', '/home/User/folder/test',
>>> import sys
>>> sys.path
['', '/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg',
'/home/User', '/home/User/folder/test','/usr/lib/python2.7',
'/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
然后我尝试打开一个文件/home/User/folder/test/pics/text/text.txt,如下所示:
>>>file = open('pics/text/text.txt','r')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory:
正如您所看到的,文件路径的前半部分是$PYTHONPATH,后半部分是open函数的参数。为什么不起作用?我应该换什么
当我从/home/User/folder/test导出路径运行python并尝试打开文件时,它成功了。open相对于当前目录,不使用PYTHONPATH。当前目录默认为在命令行上启动python时的目录
您可以使用Open更改当前目录,它相对于当前目录,并且不使用PYTHONPATH。当前目录默认为在命令行上启动python时的目录
如果我正确地阅读了您的问题,您可以使用更改当前目录,您希望数据驻留在相对于模块的位置。如果是这种情况,您可以使用:
full_path = os.path.join(os.path.split(__file__)[:-1]+['pics','text','text.txt'])
__文件是模块的路径,包括modulename.py。因此,我拆分了该路径,提取modulename.py[:-1],并通过os.path.join添加相对路径的其余部分。如果我正确地阅读了您的问题,您希望数据驻留在相对于模块的位置。如果是这种情况,您可以使用:
full_path = os.path.join(os.path.split(__file__)[:-1]+['pics','text','text.txt'])
__文件是模块的路径,包括modulename.py。因此,我拆分了该路径,提取modulename.py[:-1],并通过os.path.join添加相对路径的其余部分。每当我想要导入脚本时,相对于当前和不使用包,我通常使用
sys.path = [os.path.dirname(__file__) + "/../another_dir"] + sys.path
每当我想要导入一个脚本时,相对于当前和不使用包,我通常使用
sys.path = [os.path.dirname(__file__) + "/../another_dir"] + sys.path
这不是蟒蛇所做的;它只影响导入语句。所以我如何在没有完整文件路径的情况下打开文件?这不是PYTHONPATH所做的;它只影响导入语句。那么如何在没有完整文件路径的情况下打开文件呢?我会使用os.curdir和os.pardir来代替“.”和“..”和os.path.join,而不是/。为什么不只使用sys.path.append?mgilson:对不起,只使用+/../;不,不一样:您通常需要的是从相对于脚本位置的位置导入文件,而不是从运行脚本的目录导入文件。因此,os.path.dirnamefile为您提供了脚本所在的目录,os.curdir为您提供了目录,您可以从:dinas:not sys.path.append运行它,以确保python首先在我的位置查找模块,然后在所有其他原因中,如果某个库包含具有相同名称的模块,或者它的旧版本是在系统范围内安装的,你会痛苦地自责:我会用os.curdir和os.pardir来代替“.”和“..”和os.path.join,而不是/。为什么不只是sys.path.append?mgilson:对不起,只是+/../;不,不一样:您通常需要的是从相对于脚本位置的位置导入文件,而不是从运行脚本的目录导入文件。因此,os.path.dirnamefile为您提供了脚本所在的目录,os.curdir为您提供了目录,您可以从:dinas:not sys.path.append运行它,以确保python首先在我的位置查找模块,然后在所有其他原因中,如果某个库包含具有相同名称的模块,或者它的旧版本安装在全系统范围内,你会痛彻心扉: