Python 如何制作一个;始终相对于当前模块“;文件路径?

Python 如何制作一个;始终相对于当前模块“;文件路径?,python,module,relative-path,Python,Module,Relative Path,假设您有一个模块,其中包含 myfile = open('test.txt', 'r') “test.txt”文件位于同一文件夹中。如果要运行该模块,将成功打开该文件 现在,假设您从另一个文件夹中的另一个模块导入该模块。该文件不会在该代码所在的模块所在的文件夹中搜索 那么,如何让模块首先搜索同一文件夹中具有相对路径的文件? 通过使用“\uuuu file\uuu”或“os.getcwd()”,有多种解决方案,但我希望有一种更干净的方法,就像传递到open()或file()的字符串中的同一个特殊

假设您有一个模块,其中包含

myfile = open('test.txt', 'r')
“test.txt”文件位于同一文件夹中。如果要运行该模块,将成功打开该文件

现在,假设您从另一个文件夹中的另一个模块导入该模块。该文件不会在该代码所在的模块所在的文件夹中搜索

那么,如何让模块首先搜索同一文件夹中具有相对路径的文件?


通过使用“
\uuuu file\uuu
”或“
os.getcwd()
”,有多种解决方案,但我希望有一种更干净的方法,就像传递到open()或file()的字符串中的同一个特殊字符一样。

解决方案是使用
\uu file\uuu
,而且非常干净:

import os

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt')

对于从
.py
文件加载的普通模块,应该存在并可用。要将
\uuuu文件中的信息连接到您的相对路径,有一个比2014年以来可用的
os.path
接口更新的选项:

from pathlib import Path

here = Path(__file__).parent
fname = here/'test.txt'
with fname.open() as f:
    ...
在3.4中添加到Python中-请参阅。对于仍在Python2.7上希望使用相同API的用户,可以使用


<> P>有兴趣应用最新的可用方法的用户应该考虑移动而不是加入相对于源树的数据文件。目前,很少有用户能够将兼容性限制在Python 3.7+上,因此我提到这一点是为了提醒那些喜欢走在最前沿的人。

os.getcwd()有什么问题?
os.getcwd()返回导入该模块的第一个模块的路径,或者输入另一个输入它的。第一个模块可能位于上下多个目录中。因此,键入
os.getcwd()+'somethingelse/yetanother/finallyhere'
import os.path
似乎不是很优雅,当您执行
import os
时,模块会为您导入
os.path
os
就是这种特殊方式)。可以从os导入路径使用
,但在
os
模块中并不常见。很可能他模块中已经有了导入操作系统,或者很快就需要一个。因此,
导入操作系统
几乎总是最好的选择。我想这是最干净的。更多的是要求改变官方Python解释器的工作方式。
os
已经导入了
os.path
,这是一个实现细节。虽然到目前为止,该公约已经建立,不太可能改变,但您不应该依赖实施细节。当使用
os.path
时,显式导入
os.path
从来都不是毫无意义的。请先添加
os.path.realpath()
以获得绝对路径。path(来自pathlib)提供了许多方便的跨平台功能,与
os
相比,这将是最整洁的方法。