在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的目录中,以查看它是非常快速和肮脏,但它的作品像一个魅力:)