我想知道你想要使用相同基础包的子项目的正确/最简单/最pythonic方式.我们目前有这样的文件结构:
trunk\
proj1\setup.py
company_name\__init__.py + proj1's code
proj2\setup.py
company_name\__init__.py + proj2's code
Run Code Online (Sandbox Code Playgroud)
我们希望保持命名空间company_name对我们所有的项目都是通用的(也许这本身就是unpythonic?)但是当proj1和proj2安装在开发模式下时,第一个安装会被破坏.它看起来import company_name...很困惑在哪个company_name包中查找它并抓取第一个/最后一个/随机一个.
通常如何在更大的python项目中处理?是否可以通过构建某种巨型蛋的主干中的setup.py来解决这个问题?我没有在谷歌或堆栈上找到任何相关信息,所以任何信息甚至只是链接非常感谢!
编辑:我刚尝试在根文件夹中添加setup.py
...
namespace_packages = ['company_name'],
package_dir = {'company_name' : ['proj1/company_name', 'proj2/company_name']}
...
Run Code Online (Sandbox Code Playgroud)
适当pkg_resources.declare_namespace(__name__)的__init_.py文件,但./setup.py bdist_egg 只是给出:
company_name setup命令中的错误:分发包含名称空间包'company_name'的模块或包
我有一个 Java 应用程序,它在服务提供者中注册服务器组件,然后将服务名称发送到客户端。客户端使用服务名称从服务提供者那里获取到服务器的地址。但是,服务器有多个接口,客户端只能访问其中的一个接口,因此必须使用正确的 IP 注册服务。我们通过广播发现了客户端,所以我有客户端 IP 和计算机网络接口的枚举。在不知道客户端 IP 的网络掩码是什么的情况下,如何将 IP 与接口匹配?
我不自觉地想象将所有地址都转换为整数,并使用他们的网络掩码对本地 ip 进行处理并寻找“最佳匹配”,但我想知道是否有更好的方法?
(这是一个企业(tm)解决方案,因此切断服务提供商不是一种选择,至少不是首先没有政治运动;))
我已经厌倦了当你使用命名空间包并将你的代码库划分为单独的文件夹时,pylint无法导入文件的问题.因此,我开始深入研究astNG源代码,该代码已被确定为问题的根源(参见astng上的bugreport 8796).这个问题的核心似乎是在imp.find_module寻找进口的过程中使用蟒蛇.
什么情况是,进口的第一个(分)包- a中import a.b.c-被送到find_module一个None路径.无论返回什么路径,都会进入find_module查找循环中的下一个传递,您将尝试b在上一个示例中找到该路径.
来自logilab.common.modutils的伪代码:
path = None
while import_as_list:
try:
_, found_path, etc = find_module(import_as_list[0], path)
#exception handling and checking for a better version in the .egg files
path = [found_path]
import_as_list.pop(0)
Run Code Online (Sandbox Code Playgroud)
这就是被打破的:你只能得到第一个最好的命中find_module,可能有也可能没有你的子包.如果您没有找到子包,则无法退出并尝试下一个.
我尝试显式使用sys.path而不是None,这样结果可以从路径列表中删除并进行第二次尝试,但是python的模块查找器非常聪明,不必在路径中完全匹配,无论如何,使这种方法无法使用 - 尽我所知.
是否有一个替代find_modules将返回所有可能的匹配或采取排除列表?我也对完全不同的解决方案持开放态度.最好不要手工修补python,但这不是不可能 - 至少对于本地解决方案.
(注意事项:我正在运行python 2.6并且由于当前公司政策的原因无法升级,对p3k等的建议不会被标记为已被接受,除非它是唯一的答案.)
python ×2
importerror ×1
ip-address ×1
java ×1
lookup ×1
namespaces ×1
package ×1
pylint ×1
setuptools ×1