为开发环境管理PYTHONPATH

为开发环境管理PYTHONPATH,python,virtualenv,pythonpath,Python,Virtualenv,Pythonpath,我正在和我的团队开发几个不同的Python包。假设我们有~/src/pkg1,~/src/pkg2,和~/src/pkg3。我们如何将这些文件添加到PYTHONPATH中,而不必每个人都管理点文件 我们可以添加,比如说,~/src/site/sitecustomize.py,它只添加一次到PYTHONPATH,但它“保证”不会有全局sitecustomize.py virtualenv似乎是错误的解决方案,因为我们不希望在每次更改后都必须构建/安装软件包。我假设您的其他模块处于可预测的路径(相对

我正在和我的团队开发几个不同的Python包。假设我们有
~/src/pkg1
~/src/pkg2
,和
~/src/pkg3
。我们如何将这些文件添加到
PYTHONPATH
中,而不必每个人都管理点文件

我们可以添加,比如说,
~/src/site/sitecustomize.py
,它只添加一次到
PYTHONPATH
,但它“保证”不会有全局
sitecustomize.py


virtualenv似乎是错误的解决方案,因为我们不希望在每次更改后都必须构建/安装软件包。

我假设您的其他模块处于可预测的路径(相对于$0)

我们可以计算$0的绝对路径

os.path.realpath(sys.argv[0]) os.path.realpath(sys.argv[0]) 然后到达模块路径并附加它

sys.path.append(something) sys.path.append(某物)
首先,您不需要将python模块添加到
PYTHONPATH
,只需添加路径组件

如果您希望所有团队都在使用某个python包,可以在虚拟环境中以可编辑的方式安装该包

通过这种方式,您可以继续开发,而不必弄乱
PYTHONPATH
。请记住,工作目录始终包含在
PYTHONPATH
中,因此除非您有外部需求;您不需要虚拟环境,只需要工作目录中的源代码

您的工作流程如下所示:

  • 创建虚拟环境
  • 创建,以修改您的
    PYTHONPATH
  • 照常工作

  • 这将是我的首选。如果您的项目中有标准布局,您可以分发一个自定义的布局来创建环境,然后自动调整
    PYTHONPATH
    。在整个团队中共享此引导脚本,或将其添加为源存储库的一部分。

    我建议按照模块文档中的说明创建name.pth路径配置文件。这些文件可以包含多个路径,这些路径将被添加到
    sys.path
    ,并且易于编辑,因为它们只是文本文件。

    您有很多选择

    1) 为什么不使用dotfiles呢? 您可以使用集中存储库和版本控制来集中管理点文件。我使用名为
    dotfiles
    的Dropbox文件夹,但许多人使用
    github
    或类似的其他服务来管理dotfiles

    如果您这样做,您将保证您的开发团队中的每个人都共享一些点文件。因此,您可以定义一个点文件,比如
    .python\u proys
    ,它导出适当的
    路径
    PYTHONPATH
    ,按照惯例,每个开发人员都应该在他们的环境中

    假设pkg1只是一个脚本,pkg2是一个脚本,也是一个模块,pk3只是一个模块。然后,python_proys示例:

    export PATH=$PATH:~/src/pkg1:~/src/pkg2
    export PYTHONPATH=$PYTHONPATH:~/src/pkg2:~/src/pkg3
    
    然后,每个开发人员都必须通过转换在某个地方
    源文件
    。每个人都会按自己喜欢的方式做。可以在使用包之前手动
    source
    dotfile。另一个人可以在他的
    .bashrc
    .zshenv
    或任何适用于他的点文件中
    源代码

    其思想是有一个集中的协调点,只需维护一个点文件:python_proys点文件

    2) 使用符号链接 您可以在家中定义一个目录,如
    ~/dist
    (用于模块)和
    ~/bin
    (用于脚本),并在那里设置指向
    ~/src/
    中特定包的符号链接,并使每个开发人员都具有此
    路径
    PYTHONPATH
    设置:

    export PATH=$PATH:~/bin
    export PYTHONPATH=$PYTHONPATH:~/dist
    
    因此,在Why not dotfiles?中使用相同的示例,其中pkg1只是一个脚本,pkg2是一个脚本,也是一个模块,pkg3只是一个模块,那么您可以像这样进行符号链接:

    cd ~/bin
    ln -s ../src/pkg1
    ln -s ../src/pkg2
    cd ~/dist
    ln -s ../src/pkg2
    ln -s ../src/pkg3
    
    这些命令可以通过脚本自动执行。您可以编写引导脚本,或者简单地复制和粘贴命令并将其保存在shell脚本中。无论如何,要像我之前解释的那样维护和集中它


    通过这种方式,.dot文件不会更改,只会更改定义符号链接的脚本。

    我认为您已将问题标记为virtualenv,尝试过使用它吗?使用
    virtualenv
    您不会在每次更改后生成/安装包,只需在运行代码之前激活环境(
    .bin/activate
    )(假设您正在为自己的包使用符号链接的开发鸡蛋)。如果有人添加新包,我希望避免使用“virtualenv-e”在~/src/pkg1、~/src/pkg2、~/src/pkg3等中为团队的每个成员。每个包都有模块~/src/pkg1/mod1/_init_.py、~/src/pkg2/mod2/_init____.py等。目录~/src/pkg1等。因此需要在路径中才能看到mod1、mod2等。使用virtualenv-e时,每个同事都必须为每个项目运行它。我试图避免这些是在人们的主目录中的开发包,而不是在站点目录中。放在.pth文件中的路径可以在任何地方引用目录。