如何在Python测试中获取文件?

如何在Python测试中获取文件?,python,python-3.x,unit-testing,python-packaging,Python,Python 3.x,Unit Testing,Python Packaging,我有以下包结构: . ├── my_app │   ├── app.py │   ├── cli.py │   ├── db.py │   └── __init__.py ├── setup.py ├── tests │   ├── data │   │   └── foobar.gz │   ├── test_app.py │   └── test_database.py └── tox.ini 在test\u app.py中,我执行以下操作: import pkg_resources pa

我有以下包结构:

.
├── my_app
│   ├── app.py
│   ├── cli.py
│   ├── db.py
│   └── __init__.py
├── setup.py
├── tests
│   ├── data
│   │   └── foobar.gz
│   ├── test_app.py
│   └── test_database.py
└── tox.ini
test\u app.py
中,我执行以下操作:

import pkg_resources
path = '../tests/data/foobar.gz'
full_path = pkg_resources.resource_filename(__name__, path)
现在我看到了这个信息:

我该怎么做呢

(我也可以更改软件包的结构,但我希望将测试数据保留在测试中-这对于运行应用程序来说不是必需的)

尝试操作系统模块

import os.path

source_folder =  os.getcwd()
path = os.path.join(source_folder, 'data/foobar.gz')

要获取相对于脚本目录的路径,请尝试使用脚本位置本身:

import sys
print(sys.argv[0])
您可以使用
os.path.dirname()
获取包含脚本的目录:

然后,
os.path.join()
可能有助于创建任意路径:

import os
import sys
print(os.path.join(os.path.dirname(sys.argv[0]), "some_subdir"))

要在将测试文件名传递给
pkg_resources
时获取测试资源,需要使用文件中的路径进行测试,如:

import pkg_resources
path = 'data/foobar.gz'
full_path = pkg_resources.resource_filename(__name__, path)
对于pytest,我也在
conftest.py
中使用此模式:

@pytest.fixture('session')
def test_data_dir():
    return os.path.join(os.path.dirname(__file__), 'data')

我可以使用
os.path.join()
轻松获取任何测试数据。

os.getcwd()
返回您当前的工作目录,并将根据用户运行它的目录而改变。这不是一个好主意,也不能真正回答问题。在什么情况下你要这么做?部分问题在于,您的
tests
目录实际上不是包的一部分。这本身是好的(关于哪种方式更好有争议,但任何一种方式都是合理的)。因此,
pkg_resources
抱怨您试图访问包外的文件。如果您只想获得一个相对于
test\u app.py
的文件路径,那么您所需要的就是
os.path.join(os.path.dirname(u文件),'data','foobar.gz')
您是说我应该更改项目结构吗?
import pkg_resources
path = 'data/foobar.gz'
full_path = pkg_resources.resource_filename(__name__, path)
@pytest.fixture('session')
def test_data_dir():
    return os.path.join(os.path.dirname(__file__), 'data')