如何将我的模块添加到travis-ci的pythonpath中
我正在为我的项目设置Travis-CI,但奇怪的是,我无法导入我的项目:
$ python tests/tests.py
Traceback (most recent call last):
File "tests/tests.py", line 11, in <module>
from my_module.lib.importer import build_module_list
ImportError: No module named my_module.lib.importer
在生产环境中,我只是这样创建一个符号链接:
sudo ln -s /usr/local/my_module /usr/lib/python2.7/dist-packages/my_module
但我不知道,也不想知道,Travis-CI的文件夹结构是怎样的。
这似乎是一个已经解决的问题,但我对Travis-CI还很陌生。有什么好的方法可以让我的代码作为可导入的模块呢?
5 个回答
在before_script
中,可能需要把/home/travis/.local/lib/python2.7/site-packages/
这个路径加到PYTHONPATH
里。你可以用export PYTHONPATH=$PYTHONPATH:/home/travis/.local/lib/python2.7/site-packages/
这个命令来做到这一点。
补充一下@Brian-Cain的回答,你也可以用 setuptools
来代替 distutils
。目前,distutils
正在逐渐被淘汰,而 setuptools
则被用作替代,尽管 setuptools
还没有被纳入标准库。
from setuptools import setup, find_packages
setup(name='Foo',
version='0.0.1',
description='Python Distribution Utilities',
author='',
author_email='',
url='',
packages=find_packages(exclude=['contrib', 'docs', 'tests*']),
)
如果你想快速学习如何用 setuptools
创建一个 setup.py
文件,可以参考这个教程:https://packaging.python.org/tutorials/distributing-packages/
这里有一个真实的例子:https://github.com/pypa/sampleproject/blob/master/setup.py
这肯定不是最好的方法,但它确实有效。在我的 .travis.yml 文件中,我在 install
属性里添加了以下一行:
- ln -s `pwd` $(dirname `which python`)/../lib/python2.7/site-packages/my_module
这基本上是找到 Python 安装的目录,然后在里面添加一个叫 my_module
的符号链接。我很乐意听到更好的解决方案,因为这个方法感觉很脆弱。
更新:可以看看 @Brian Cain 的回答,那里有一个更好的解决办法。
为了快速解决这个问题,你可以在 before_script
阶段添加以下内容:
export PYTHONPATH=$PYTHONPATH:$(pwd)
更好的方法(虽然需要多花一点时间)是Brian Cain提到的,也就是写一个 setup.py
文件,并在 install
阶段添加 pip install .
。
如果你在使用makefile的话,你也可以用下面这样的命令来实现。
test:
$(shell export PYTHONPATH=$PYTHONPATH:$(pwd))
python setup.py test
怎么才能让我的代码变成一个可以被导入的模块呢?
最好的办法就是用 distutils
,绝对不要用 ln
。
在生产环境中,我只是创建一个符号链接……
可是为什么呢?用正确的方法做这件事其实很简单!只需要几行代码就能搞定:
根据官方手册,只需创建一个这样的 setup.py
文件:
from distutils.core import setup
setup(name='Distutils',
version='1.0',
description='Python Distribution Utilities',
author='Greg Ward',
author_email='gward@python.net',
url='https://www.python.org/sigs/distutils-sig/',
packages=['distutils', 'distutils.command'],
)
现在你可以做一些很棒的事情,比如运行 python setup.py install
、python setup.py bdist_rpm
或者 pip install .
,这不仅适用于Travis环境,也适用于你的整个项目。