我们正在用 Python 启动一个新项目,其中包含一些我们希望保密的专有算法和敏感逻辑。我们还将有一些外部人员(精选的公众成员)参与代码工作。我们不能授予外部人员访问小型私有代码的权限,但我们希望公共版本能够为他们提供足够好的工作空间。
假设我们的项目 Foo 有一个模块,bar
,只有一个函数,get_sauce()
。到底发生了什么get_sauce()
是秘密的,但我们想要一个公开版本get_sauce()
返回可接受的(尽管不正确)结果。
我们还运行自己的 Subversion 服务器,因此我们可以完全控制谁可以访问什么。
Symlinks
我的第一个想法是符号链接——而不是bar.py
, 提供bar_public.py
给大家和bar_private.py
仅限内部开发人员。不幸的是,创建符号链接是一项乏味的手动工作——尤其是当确实有大约两打这样的私有模块时。
更重要的是,它使 Subversion authz 文件的管理变得困难,因为对于我们想要保护的每个模块,必须在服务器上添加例外。有人可能会忘记执行此操作并意外地检查机密...然后该模块位于存储库中,我们必须在没有它的情况下重建存储库,并希望外部人员在此期间没有下载它。
多个存储库
下一个想法是拥有两个存储库:
private
└── trunk/
├── __init__.py
└── foo/
├── __init__.py
└── bar.py
public
└── trunk/
├── __init__.py
└── foo/
├── __init__.py
├── bar.py
├── baz.py
└── quux.py
这个想法是只有内部开发人员才能检查两者private/
and public/
。内部开发人员将设置他们的PYTHONPATH=private/trunk:public/trunk
,但其他人都会设置PYTHONPATH=public/trunk
。那么无论是内部人员还是外部人员都可以from foo import bar
并获得正确的模块,对吧?
让我们试试这个:
% PYTHONPATH=private/trunk:public/trunk python
Python 2.5.1
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo.bar
>>> foo.bar.sauce()
'a private bar'
>>> import foo.quux
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named quux
我不是 Python 专家,但似乎 Python 对于 module 已经下定决心了foo
以及与之相关的搜索:
>>> foo
<module 'foo' from '/path/to/private/trunk/foo/__init__.py'>
连删除都不行foo
helps:
>>> import sys
>>> del foo
>>> del sys.modules['foo']
>>> import foo.quux
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named quux
您能为我提供更好的解决方案或建议吗?