我为C库创建了一个Python包装器。该库需要一个环境变量(MY_DATA_FOLDER
)来指向包含一些数据文件的文件夹。在运行setup.py时,数据文件(在我的包装器的当前实现中)与Python包装器一起安装,并与包安装一起放在名为coefficients
的文件夹中。我在包__init__.py
中设置了环境变量,无论何时导入包都会有效:
# set environment variable
import os
from os.path import join, realpath, dirname
MY_DATA_FOLDER = join(realpath(dirname(__file__)), 'coefficients')
os.environ['MY_DATA_FOLDER'] = MY_DATA_FOLDER
# import the C extension (mymodule._mymodule) after setting the variable above
from mymodule import _mymodule
包装函数现在可用mymodule._mymodule.myfunction()
。我用tox测试包,一切都运行良好。如果它有用,我的testenv
会有以下命令:
commands =
python setup.py clean --all build_ext --force --inplace
{posargs:py.test -vv --ignore=src}
但是,当我使用python setup.py install
(或develop
或pip install .
使用或不使用-e
)安装软件包并打开Python shell来运行包装器时,C library给出错误,指示未设置环境变量。无论我运行一些自定义代码还是像tox一样运行py.test -vv --ignore=src
,都会发生这种情况。一切都是可导入的,并且C扩展程序确实运行(即它已正确编译),但环境变量未传递,因此错误。
我已经把头撞到墙上一段时间了,我不知道出了什么问题,显然Google也没有。为什么环境变量在运行tox时可用于C扩展,但在正常安装时不可用?
如果需要,我很乐意提供更多信息。整个来源是here。
现在有效。这似乎是一个典型的案例,经过几个小时的斗争,放弃和离开工作,第二天回来,一切正常。"我不明白为什么,但我一定做错了。也许我的环境并不像我想的那么干净,或者我忘了激活它。