在Python中使用代码库时如何引用资源的相对path

我们正在使用一个代码库,它既可以部署到Windows,也可以在Linux上 – 有时在不同的目录中。 项目中的某个模块应该如何引用项目中的非Python资源之一(CSV文件等)?

如果我们做这样的事情:

thefile=open('test.csv') 

要么:

 thefile=open('../somedirectory/test.csv') 

它只有在脚本从一个特定的目录或目录的一个子集运行时才有效。

我想要做的是这样的:

 path=getBasePathOfProject()+'/somedirectory/test.csv' thefile=open(path) 

这是正确的吗? 可能吗?

尝试使用相对于当前文件path的文件名。 './my_file'的例子:

 fn = os.path.join(os.path.dirname(__file__), 'my_file') 

如果您正在使用安装工具或分发(setup.py安装),那么访问这些打包资源的“正确”方式似乎是使用package_resources。

在你的情况下,这个例子是

 import pkg_resources my_data = pkg_resources.resource_string(__name__, "foo.dat") 

哪一个读取资源,读取的二进制数据是my_data的值

如果你只需要文件名,你也可以使用

 resource_filename(package_or_requirement, resource_name) 

例:

 resource_filename("MyPackage","foo.dat") 

优点是即使是像鸡蛋一样的档案分发,它也能保证工作。

请参阅http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api

我经常使用类似这样的东西:

 import os DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'datadir')) # if you have more paths to set, you might want to shorten this as here = lambda x: os.path.abspath(os.path.join(os.path.dirname(__file__), x)) DATA_DIR = here('datadir') pathjoin = os.path.join # ... # later in script for fn in os.listdir(DATA_DIR): f = open(pathjoin(DATA_DIR, fn)) # ... 

variables

 __file__ 

保存您编写代码的脚本的文件名,以便您可以制作相对于脚本的path,但仍然使用绝对path编写。 它工作得很好,原因如下:

  • path是绝对的,但仍然是相对的
  • 该项目仍然可以部署在相对容器中

但是您需要注意平台的兼容性 – Windows的os.pathsep与UNIX不同。

 import os cwd = os.getcwd() path = os.path.join(cwd, "my_file") f = open(path) 

你也尝试使用os.path.abspath(os.getcwd())来标准化你的cwd 。 更多信息在这里 。

在Python中,path是相对于当前工作目录而言的 ,在大多数情况下,它是运行程序的目录。 当前的工作目录很可能不像你的模块文件的目录,所以使用相对于你当前模块文件的path总是一个不好的select。

使用绝对path应该是最好的解决scheme:

 import os package_dir = os.path.dirname(os.path.abspath(__file__)) thefile = os.path.join(package_dir,'test.cvs') 

您可以使用__file__variables中的构build。 它包含当前文件的path。 我将在项目的根目录中的模块中实现getBaseOfProject。 在那里我会得到__file__的path部分,并会返回。 这个方法可以在你的项目中随处使用。

我花了很长的时间想出了这个答案,但我终于明白了(其实很简单):

 import sys import os sys.path.append(os.getcwd() + '/your/subfolder/of/choice') # now import whatever other modules you want, both the standard ones, # as the ones supplied in your subfolders 

这将把你的子文件夹的相对path追加到python的目录中,以查看它是非常快速和肮脏,但它的作品像一个魅力:)