2017-03-06 27 views
2

我正在使用Python来开发少数公司特定的应用程序。有一个定制的共享模块(“库”),它描述了一些数据和算法,并且有数十个Python脚本可以与这个库一起工作。有相当多的这些文件,所以他们在子文件夹如何使用依赖包括我自己的自定义库来维护python应用程序?

myproject 
    apps 
     main_apps 
      app1.py 
      app2.py 
      ... 
     utils 
      util1.py 
      util2.py 
      ... 
    library 
     __init__.py 
     submodule1 
      __init__.py 
      file1.py 
      ... 
     submodule2 
      ... 

用户希望通过简单地去,说要运行这些脚本组织,以MYPROJECT \ utils的并推出“PY util2.py some_params”。其中许多用户都是开发人员,因此他们经常想要编辑库并立即使用更新后的代码重新运行脚本。这个项目也有一些第三方库,我想确保每个人都使用这些库的相同版本。

现在,有我遇到了两个关键问题:

  1. 如何引用自(应用程序)(库)?
  2. 如何管理第三方依赖关系?

许多Python开发人员都很熟悉第一个问题,并曾多次被问到:要指示Python从“.... \ library”导入包是相当困难的。我测试了几种不同的方法,但似乎python不愿在任何地方搜索包,而是在标准库位置或脚本本身的文件夹中搜索包。

  • 相对导入不起作用,因为脚本不是库的一部分(即使是这样,当脚本直接执行除非它被放置在“根”项目文件夹中,这仍然不起作用倒要避免)
  • 读取this document)脚本文件夹放置.pth文件(如人们想象的显然不会有任何影响

当然有工作的sys.path直接干预,但样板代码像这样的在每个和脚本文件的每一个看起来相当可怕

import sys, os.path 
here = os.path.dirname(os.path.realpath(__file__)) 
module_root = os.path.abspath(os.path.join(here, '../..')) 
sys.path.append(python_root) 
import my_library 

我意识到,这是因为Python的希望我的图书馆被正确“安装”,这就是确实是唯一正确的方式去了这个库是从使用它的脚本单独开发。但不幸的是,情况并非如此,我认为每次更改库时重新进行“安装”将会非常不方便,并且容易出错。

第二个问题很简单。有人在我们的应用程序/ lib中添加了新的第三方模块,并且所有人在更新应用程序后都会看到导入问题。开发的几个分支,不同的时刻,当用户做点安装,很少回滚 - 每个人最终都会使用不同版本的第三方模块结束。在我的情况下,事情还的事实,许多开发者工作了很多与老的Python 2.x的代码复杂,而我想上移动到Python 3.x的

尽管找我的问题可能的解决方案,我在Python中发现了一个非常出色的虚拟环境功能。事情看起来很亮:

  1. 为MyProject的创建VENV
  2. 分发程序的要求。txt文件作为应用程序的一部分,并提供填充VENV相应
  3. 符号链接自己的库VENV site_packages文件夹,所以它会被Python

总是被检测到该解决方案看起来很自然&强大的脚本。我明确地为自己的项目设置了自己的环境,并将我需要的任何东西放置到该Venv中,包括我自己的lib,我仍然可以即时编辑。它确实有效。但调用 activate.bat使这个python环境处于活动状态,另一个批处理文件停用它是一团糟,特别是在Windows平台上。正在编辑sys.path的样板代码看起来很糟糕,但至少它不会像这个潜在的修补程序那样干扰UX。

所以有一个问题,我想问。

  1. 有没有办法将特定的python venv绑定到特定的文件夹,所以python启动器会自动将这个venv用于这些文件夹中的脚本?
  2. 有没有更好的替代方法来处理我错过的这种情况?

环境为我的项目是Python的3.6在Windows 10上运行

+0

你使用'setuptools.py'来“安装”吗?如果是这样,你可以使用'develop'命令行参数而不是'install',参见讨论[这里](http://stackoverflow.com/questions/19048732/python-setup-py-develop-vs-install) 。这使您可以在库上工作,并立即查看您所做的更改。 –

+0

不幸的是,据我所知,那些对你有用的工具在Windows上并不是真的可用。例如,你可能试着寻找相当于['autoenv'](https://github.com/kennethreitz/autoenv) –

+0

谢谢!这是我完全错过的一个很好的选择。现在在我的项目中没有“安装”过程,只需通过修改的sys.path查找模块即可。我更喜欢使用PIP而不是setuptools.py,但它有一个类似的选项('pip install -e'),这是使用我的自定义库与符号链接选项初始化环境(虚拟或非虚拟)的好方法。这样,在很多情况下,在没有任何虚拟环境的情况下也可能会生活(尽管我更喜欢保留一个以便更容易地控制依赖关系) –

回答

1

我想我终于找到了一个合理的答案。只需在venv中添加指向python解释器的shebang行即可,例如

#!../../venv/Scripts/python 

整个项目结构看起来像这样

myproject 
    apps 
     main_apps 
      app1.py (with shebang) 
      app2.py (with shebang) 
      ... 
     utils 
      util1.py (with shebang) 
      util2.py (with shebang) 
      ... 
    library 
     __init__.py 
     submodule1 
      __init__.py 
      file1.py 
      ... 
     submodule2 
      ... 
    venv 
     (python interpreter, 3rd party modules) 
     (symlink to library) 
    requirements.txt 
    init_environment.bat 

和工作的事情是这样的:

  1. VENV是一切虚拟的Python环境项目需要
  2. init_environment.bat是一个根据requirements.txt填充venv的脚本,并将一个符号链接放到我的库中,并放入venv站点模块
  3. 所有的脚本与shebang行指向(使用相对路径)开始VENV解释

有一个与所有的库,包括我自己,并使用它都将有很自然的进口脚本,完全自定义的环境。当我的项目中的任何面向用户的脚本从控制台或Windows资源管理器启动时,Python启动器也将自动选择Python 3.6作为解释器&加载相关模块。

缺点:

  1. 如果脚本是从其他文件夹,名为
  2. 用户仍然必须手动运行init_environment.bat更新根据虚拟环境requirements.txt
  3. 相对家当将无法正常工作
  4. 在Windows init_environment纸条需要提升权限,使一个符号链接(但希望那个奇怪的MS决定将固定在April'17即将到来的Win10更新)

但是我可以忍受这些限制。希望这会帮助其他人寻找类似的问题。

如果还能听到其他选项(如答案)和评论者(如评论),仍然不错。

相关问题