Python导入;忽略分支/主干/标签层

时间:2015-10-28 20:30:27

标签: python bash svn pythonpath

我如何破解PYTHONPATH如下。

目前我有

trunk/
   subproject1/
      __init__.py
      subsubproject/
          __init__.py
          module1.py
   subproject2/
   subproject3/
branch/ ...
tag/ ...

所以我只设置了PYTHONPATH=trunk

import subproject1.subsubproject.module1

按预期工作

然而,子项目变得笨重。

我想要

trunk/
   subproject1/
      # __init__.py # I imagine these may have to be sacrificed 
      subsubproject/
          trunk/
              module1.py
          branch/ ...
          tag/ ...
   subproject2/
   subproject3/

我仍然可以使用相同的import语句,即

import subproject1.subsubproject.module1

python更可取,但bash可以接受

我一直在修补__init__.py__all__无济于事。我会继续努力,但如果有人已经这样做了,我会很感激节省的时间。

2 个答案:

答案 0 :(得分:0)

__init__.py的{​​{1}}的{​​{1}}中添加以下内容:

trunk

这应该允许您按照自己的意愿导入。

答案 1 :(得分:0)

以下代码最终为我工作(添加了一项功能,我可以通过设置env var来选择加载trunk或特定tag / branch

import os
from pkgutil import extend_path

_file_path, _file_name = os.path.split(os.path.abspath(__file__))[0]

_svn_ver = os.environ['SVN_VER'] if 'SVN_VER' in os.environ else 'trunk'
if 'SVN_VER%s' % _file_name in os.environ:
     _svn_ver = os.environ['SVN_VER%s' % _file_name]

__path__ = extend_path(__path__, os.path.join(_file_path, _svn_ver))

Python社区已经想到了一切,我喜欢这种语言!我暂时不回答这个问题,看看是否有更好的解决方案。

修改

对上述内容进行了一些细微的修改,因为某些进口仍无效

import os

_file_path, _file_name = os.path.split(os.path.abspath(__file__))

_svn_ver = os.environ['SVN_VER'] if 'SVN_VER' in os.environ else 'trunk'
if 'SVN_VER%s' % _file_name in os.environ:
     _svn_ver = os.environ['SVN_VER%s' % _file_name]

__path__ += [os.path.join(__path__[0], _svn_ver)]
execfile(os.path.join(_file_path, _svn_ver, '__init__.py'))

此代码可以添加到包含branch / tag / trunk的每个目录以及这些__init__.py内的branch个文件中。仍将被使用。