Python包中的脚本

14 投票
4 回答
5282 浏览
提问于 2025-04-16 22:07

我正在开发一个Python应用程序,决定把它做成一个可以通过 easy_installpip 安装的包。我搜索了一下,找到了几个关于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 installpip/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 个回答

3

最简单的方法就是设置正确的Python路径,这样Python就知道在当前目录下寻找my_package

在Linux系统上(使用Bash命令行):

export PYTHONPATH=.
bin/server-run

在Windows系统上:

set PYTHONPATH=.
python bin/server-run
4

你可以使用 virtualenv 来测试你的Python代码,就像它已经正式发布了一样,这样可以帮助你在开发过程中更好地管理和测试代码。

4

你需要使用相对导入。试试这个:

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

撰写回答