我开发了python应用程序,我决定转而使用easy_install
或pip
之后安装的软件包。我已经使用搜索来查找有关python包的目录结构的几个很好的来源,请参阅this answer或this post。
我创建了以下结构(我在列表中省略了几个文件以使结构更清晰)
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
目录中,因此如果我运行ImportError
./bin/server-run
user@host:~/dev/Project/$ ./bin/server-run Traceback (most recent call last): File "./bin/server-run", line 2, in import my_package ImportError: No module named my_package
是否可以修改bin/server-run
脚本,以便在我从文件系统某处的另一个文件夹(不一定来自Project
dir)运行它时它会起作用?另请注意,我想使用(如果可以实现)相同的脚本来在生产环境中运行服务器。
答案 0 :(得分:5)
您需要相对进口。尝试
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
答案 1 :(得分:4)
您可以使用virtualenv
在开发过程中测试Python代码,就像它已发布一样
答案 2 :(得分:2)
最简单的方法是配置正确的Python路径,因此Python知道在当前目录中查找my_package
。
在Linux上(使用Bash):
export PYTHONPATH=.
bin/server-run
在Windows上:
set PYTHONPATH=.
python bin/server-run
答案 3 :(得分:0)
现在有 console_scripts approach。参见例如
entry_points={
'console_scripts': [
'wikibackup = wikibot.wikipush:mainBackup',
'wikiedit = wikibot.wikipush:mainEdit',
'wikinuke = wikibot.wikipush:mainNuke',
'wikipush = wikibot.wikipush:mainPush',
'wikiupload = wikibot.wikipush:mainUpload',
'wikiuser = wikibot.wikiuser:main',
],
},
来自 https://pypi.org/project/py-3rdparty-mediawiki/(我是提交者)。
如果您对该软件包执行 pip 安装,上述脚本将作为安装过程的一部分进行安装。
有关安装脚本的完整源代码,请参阅 https://github.com/WolfgangFahl/py-3rdparty-mediawiki/blob/master/setup.py。