我们正在与部署既Windows和Linux的代码存储库工作 - 有时在不同的目录中。 在项目中的一个模块应该如何参照非Python的资源的一个项目(CSV文件等)?
如果我们这样做:
thefile=open('test.csv')
要么:
thefile=open('../somedirectory/test.csv')
当脚本是从一个特定的目录,或目录的一个子集运行它只会工作。
我想要做的是一样的东西:
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
这是正确的方式? 可能吗?
尝试使用相对于当前文件路径的文件名。 实施例关于“./my_file”:
fn = os.path.join(os.path.dirname(__file__), 'my_file')
在Python 3.4+,您还可以使用pathlib :
fn = pathlib.Path(__file__).parent / '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))
# ...
变量
__file__
拥有你写的代码脚本的文件名,这样就可以使相对脚本路径,但绝对路径仍被写入。 它的工作原理相当好以下几个原因:
- 路径是绝对的,而是相对仍
- 该项目仍然可以在相对容器进行部署
但是,你需要监视平台的兼容性 - Windows的os.pathsep比UNIX不同。
在Python中,路径是相对于当前工作目录 ,在大多数情况下是从你运行你的程序的目录。 当前的工作目录很可能不是同你的模块文件的目录,因此,使用相对于当前的模块文件的路径始终是一个不错的选择。
使用绝对路径应该是最好的解决办法:
import os
package_dir = os.path.dirname(os.path.abspath(__file__))
thefile = os.path.join(package_dir,'test.cvs')
import os
cwd = os.getcwd()
path = os.path.join(cwd, "my_file")
f = open(path)
你也去尝试标准化您的cwd
使用os.path.abspath(os.getcwd())
更多信息这里 。
您可以使用构建__file__
变量。 它包含当前文件的路径。 我会在你的项目的根在一个模块中实现getBaseOfProject。 在那里,我会得到的路径部分__file__
并会返回。 该方法然后可以在项目中使用无处不在。
我花了很长的时间找出这个问题的答案,但我终于得到它(它实际上是很简单):
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
这将您的子文件夹的相对路径追加到目录的蟒蛇看在这是非常快速和肮脏的,但它就像一个魅力:)
文章来源: How to refer to relative paths of resources when working with a code repository in Python