12

我开发了 python 应用程序,我决定将其转换为要在easy_installpip以后安装的包。我已经使用搜索找到了几个关于 python 包目录结构的好资源,请参阅这个答案这篇文章

我创建了以下结构(我在列表中省略了几个文件以使结构更清晰)

项目/
|-- 仓/
|-- 我的包/
| |-- 测试/
| | |-- __init__.py
| | |-- 测试服务器.py
| |-- __init__.py
| |-- 服务器.py
| |-- 实用程序.py
|-- 文档/
| |-- 索引.rst
|-- README.txt
|-- 许可证.txt
|-- 设置.py           

之后我创建了可执行脚本server-run

#!/usr/bin/env python
从 my_package 导入服务器

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
回溯(最近一次通话最后):
  文件“./bin/server-run”,第 2 行,在
    导入我的包
ImportError:没有名为 my_package 的模块

是否可以修改bin/server-run脚本以便如果我从文件系统中某处的另一个文件夹运行它(不一定从Project目录)运行它?另请注意,我想使用(如果可以实现)相同的脚本在生产环境中运行服务器。

4

4 回答 4

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
于 2011-07-23T07:45:16.220 回答
4

您可以virtualenv在开发过程中用于测试 Python 代码,就像它已发布一样

于 2011-07-23T08:34:14.617 回答
3

最简单的方法是配置正确的 Python 路径,让 Python 知道my_package在当前目录中查找。

在 Linux 上(使用 Bash):

export PYTHONPATH=.
bin/server-run

在 Windows 上:

set PYTHONPATH=.
python bin/server-run
于 2011-08-08T15:21:56.070 回答
1

现在有console_scripts 方法。参见例如

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

于 2021-01-17T11:28:20.093 回答