我有一个共享的python库,我在多个项目中使用,所以结构如下所示:
Project1
main.py <--- (One of the projects that uses the library)
...
sharedlib
__init__.py
ps_lib.py
another.py
现在在每个项目的 main.py 中,我使用以下hack来使其工作:
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
import sharedlib.ps_lib
...
有没有办法在不使用此黑客的情况下执行此操作?或者有更好的方法来组织项目结构吗?
答案 0 :(得分:2)
我认为最好的方法是让sharedlib
成为一个真正的包。这意味着改变结构:
sharedlib/
sharedlib/
__init__.py
ps_lib.py
another.py
setup.py
在setup.py
中使用此类内容(部分来自Python-packaging "Minimal Structure"):
from setuptools import setup
setup(name='sharedlib',
version='0.1',
description='...',
license='...',
packages=['sharedlib'], # you might need to change this if you have subfolders.
zip_safe=False)
然后在sharedlib
包的根文件夹中使用python setup.py develop
或pip install -e .
进行安装。
这样(使用develop
或-e
选项)对sharedlib/sharedlib/*
文件内容的更改将在不重新安装sharedlib
包的情况下显示 - 尽管您可以如果您正在使用交互式解释器,则需要重新启动解释器。这是因为解释器缓存了已经导入的包。
来自setuptools
文档:
Setuptools允许您部署项目以在公共目录或临时区域中使用,但不复制任何文件。 因此,您可以在其checkout目录中编辑每个项目的代码,只需在更改项目的C扩展或类似编译的文件时运行构建命令。 [...]
为此,请使用
setup.py develop
命令。
(强调我的)
最重要的是,您现在可以import sharedlib
到处 - 不再需要在sharedlib
或PATH
中插入PYTHONPATH
包,因为Python(或至少你安装它的Python)现在像任何其他已安装的软件包一样对待sharedlib
。
答案 1 :(得分:0)
此post描述了组织项目的好方法。 在我看来,如果是共享库,你必须考虑将它用作真正的库(包含在virtualenv中)或添加文件夹&#34; lib&#34;每个项目。
答案 2 :(得分:0)
我们这样做的方法是为python脚本使用bash entry-scripts。我们的目录结构类似于以下内容:
var be = Country.GetBindingExpression(XamComboEditor.ItemsSourceProperty);
if (be != null && be.ParentBinding != null)
...
然后我们的lib文件夹包含所有子项目
/opt/stackoverflow/
-> bin
-> conf
-> lib
-> log
然后当我们想要执行python脚本时,我们将通过bin目录中的bash脚本执行它
/opt/stackoverflow/lib/
-> python_algorithms
-> python_data_structures
-> python_shared_libraries
如果我们使用其中一个入口脚本
/opt/stackoverflow/bin/
-> quick_sort.sh
-> merge_sort.sh