如何在Python中设置环境变量并在C扩展中使用它们

如何在Python中设置环境变量并在C扩展中使用它们,python,Python,我已经为C库创建了一个Python包装器。库需要一个环境变量(MY_DATA_FOLDER)来指向包含一些数据文件的文件夹。数据文件(在my wrapper的当前实现中)在运行setup.py时与Python wrapper一起安装,并与软件包安装一起放置在名为coverties的文件夹中。我在包的\uuuu init\uuuuu.py中设置了环境变量,每当导入包时都会例外: # set environment variable import os from os.path import joi

我已经为C库创建了一个Python包装器。库需要一个环境变量(
MY_DATA_FOLDER
)来指向包含一些数据文件的文件夹。数据文件(在my wrapper的当前实现中)在运行setup.py时与Python wrapper一起安装,并与软件包安装一起放置在名为
coverties
的文件夹中。我在包的
\uuuu init\uuuuu.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.\u mymodule.myfunction()
。我正在用tox测试包装,一切正常。如果有用,my
testenv
具有以下命令:

commands =
    python setup.py clean --all build_ext --force --inplace
    {posargs:py.test -vv --ignore=src}
但是,当我使用
python setup.py install
(或
develope
pip install.
带或不带
-e
)安装软件包并打开python shell以运行包装器时,C库会给出一个错误,指示未设置环境变量。无论我运行一些自定义代码还是像tox一样运行py.test-vv--ignore=src,都会发生这种情况。一切都是可导入的,并且C扩展确实运行(即,它被正确编译),但是环境变量没有传递,因此出现了错误

我的头撞在墙上已经有一段时间了,我不知道会出什么问题,显然谷歌也不知道。为什么在运行tox时环境变量对C扩展可用,而在正常安装时环境变量不可用

如果需要,我很乐意提供更多信息。整个来源是


更新
现在可以了。这似乎是一个典型的“挣扎几个小时,放弃工作,第二天回来,一切都正常”的例子。我不知道为什么,但我一定是做错了什么。也许我的环境没有我想象的那么干净,或者我忘了激活它。

我已经从源代码运行了
python setup.py install
,然后在解释器中尝试了-
aacgmv2.\u aacgmv2.setDateTime
。似乎有效?尝试将其安装到fresh virtualenv中,也许问题会消失。可以访问它是的,但尝试运行该功能,例如
aacgmv2.\u aacgmv2.setDateTime(2015,1,1,0,0,0)
。那将失败(至少对我来说)。我尝试了一个全新的环境(使用conda),但不起作用。它不会返回任何结果。它会为你崩溃吗?我在Linux Mint 17上安装了Python3.4 x86_64,这似乎是一个典型的“挣扎几个小时,放弃工作,第二天回来,一切正常”的例子。我不知道为什么,但我昨天肯定做错了什么。也许我的环境没有我想象的那么干净,或者我忘了激活它。