Python包中的脚本
我正在开发一个Python应用程序,决定把它做成一个可以通过 easy_install
或 pip
安装的包。我搜索了一下,找到了几个关于Python包目录结构的好资料,比如 这个回答 和 这个帖子。
我创建了以下的结构(为了让结构更清晰,我省略了一些文件)
Project/
|-- bin/
|-- my_package/
| |-- test/
| | |-- __init__.py
| | |-- test_server.py
| |-- __init__.py
| |-- server.py
| |-- util.py
|-- doc/
| |-- index.rst
|-- README.txt
|-- LICENSE.txt
|-- setup.py
之后,我创建了一个可执行的脚本 server-run
#!/usr/bin/env python
from my_package import server
server.main()
并把它放在 bin
目录里。如果我通过 python setup.py install
或 pip/easy_install
安装我的包,一切都很顺利,我可以运行 server-run
,然后我的服务器就开始处理请求了。
但我想问的是,如何在开发环境中测试 server-run
是否能正常工作(不需要事先安装 my_package
)?我还想用这个脚本来运行最新的服务器代码进行开发。
开发是在 Project
目录下进行的,所以如果我运行 ./bin/server-run
就会出现 ImportError
错误。
user@host:~/dev/Project/$ ./bin/server-run
Traceback (most recent call last):
File "./bin/server-run", line 2, in <module>
import my_package
ImportError: No module named my_package
有没有办法修改 bin/server-run
脚本,让它可以在文件系统中的其他文件夹运行(不一定要从 Project
目录运行)?另外,我还想知道,如果可以的话,能否用同一个脚本在生产环境中运行服务器。
4 个回答
最简单的方法就是设置正确的Python路径,这样Python就知道在当前目录下寻找my_package
。
在Linux系统上(使用Bash命令行):
export PYTHONPATH=.
bin/server-run
在Windows系统上:
set PYTHONPATH=.
python bin/server-run
你可以使用 virtualenv
来测试你的Python代码,就像它已经正式发布了一样,这样可以帮助你在开发过程中更好地管理和测试代码。
你需要使用相对导入。试试这个:
from .. import mypackage
或者这个:
from ..mypackage import server
相关的文档在这里
http://docs.python.org/tutorial/modules.html#intra-package-references
这些方法适用于Python 2.5及更新版本。
如果只想在开发版本中使用,可以试试:
try:
from my_package import server
except ImportError:
from ..my_package import server