Python 如何在pytest中导入函数

Python 如何在pytest中导入函数,python,python-2.7,pytest,Python,Python 2.7,Pytest,我正在尝试为Python2.x脚本可执行文件创建一个名中包含破折号的pytest。我试图以通常的方式导入它,但我不知道如何使它与破折号一起工作 我的项目结构如下: package -- tests -- bin -- subpackage -- ...py 具体地说,我需要测试一个名为master\u disaster()的函数,该函数存在于bin/let me out(对-)中let me out是一个可执行的.py文件,我的文件夹没有setup.p

我正在尝试为Python2.x脚本可执行文件创建一个名中包含破折号的
pytest
。我试图以通常的方式导入它,但我不知道如何使它与破折号一起工作

我的项目结构如下:

package
    -- tests
    -- bin 
    -- subpackage
        -- ...py
具体地说,我需要测试一个名为
master\u disaster()
的函数,该函数存在于
bin/let me out
(对
-
)中
let me out
是一个可执行的
.py
文件,我的文件夹没有
setup.py
文件或任何类似文件

如何在测试中导入此函数?我的测试将是一个简单的夹具,用于检查时间:

@pytest.fixture
def now():
    return timezone.now()

然后,它使用
now()
函数创建一个新文件,该文件
let me out
将在特定时间后删除。

首先,破折号将
let me out
字转换为Python中的无效标识符。要解决这个问题,必须调用
imp
(Python 2.7) 或
importlib
(Python 3.5+)机器

Python 3.5+ 下面是一个导入新模块的示例,该模块具有限定名称
let_me_out
,但使用
bin/let me out
作为源文件:

import importlib


def test_master_disaster():
    loader = importlib.machinery.SourceFileLoader('let_me_out', 'bin/let-me-out')
    spec = importlib.util.spec_from_loader(loader.name, loader)
    let_me_out = importlib.util.module_from_spec(spec)
    loader.exec_module(let_me_out)
    # this is only a stub, to show an example of calling the master_disaster function
    assert let_me_out.master_disaster() == 'spam'
您可以将此代码提取到夹具中以使其可重用:

import importlib
import pytest


@pytest.fixture(scope='session')
def let_me_out():
    loader = importlib.machinery.SourceFileLoader('let_me_out', 'bin/let-me-out')
    spec = importlib.util.spec_from_loader(loader.name, loader)
    let_me_out = importlib.util.module_from_spec(spec)
    loader.exec_module(let_me_out)
    return let_me_out


def test_master_disaster(let_me_out):
    assert let_me_out.master_disaster() == 'spam'
Python 2.7 使用Python 2.7,事情变得更加简单:

import imp
import pytest


@pytest.fixture(scope='session')
def let_me_out():
    return imp.load_source('let_me_out', 'bin/let-me-out')


def test_master_disaster(let_me_out):
    assert let_me_out.master_disaster() == 'spam'

谢谢你的回答。我忘了说,但我使用的是Python2.7。@啊,我在Python2.7上添加了一个使用
imp
的示例,请查看。