我是Python新手。我在一家公司,他们用Python构建了一个大型系统。他们使用专有系统来管理系统运行时的路径,但现在我被要求构建一个独立的脚本,与系统中的某些代码进行交互。可悲的是,我的独立脚本不会在他们使用的路径管理器下运行,所以我需要自己找出路径。
所以,例如,我有这一行:
from hark.tasks import REPLY_LINE
这实际上是从他们的一些旧代码中复制而来的。在这种情况下,脚本可以找到hark,但hark有一个__init__.py
文件,这就是问题的起点。所以我明白了:
meg/src/python2/hark/hark/__init__.py in <module>()
5 from flask import jsonify, render_template, request
6 import jinja2
----> 7 import logbook, logbook.compat
8
9 from healthhark.context import Ghost, g
他们建造的项目实际上包括3次日志。如果我这样做:
find . -name "*logbook*"
我明白了:
meg/zurge/opt/python2.7/lib/python2.7/site-packages/logbook
meg/zurge/opt/python2.7-hark/lib/python2.7/site-packages/logbook
meg/zurge/opt/python3.4/lib/python3.4/site-packages/logbook
就像我说的,他们有一个专有的路径管理器,通常会告诉每一段代码,它可以找到它应该包含的包,但我正在构建一个独立的应用程序。
我不太了解Python,但我想知道他们是否是一种惯用的Pythonic方式来包含这些远程目录中的软件包?
而且,在任何人建议pip install
之前,我们根本不依赖于全局安装。
答案 0 :(得分:1)
最佳解决方案可能是virtualenv或virtualenvwrapper。这将允许您定义包含脚本所需的所有库的环境。这不是全球性的。
这可以按如下方式完成:
source /usr/local/bin/virtualenvwrapper.sh
workon hark_task_script_env || ( mkvirtualenv hark_task_script_env && pip install -r requirements.txt )
python your-script.py
virtualenvwrapper将环境安装到主目录中的文件夹中。 plain virtualenv库将环境安装到项目的文件夹中。除此之外,它们是等价的。
我真的建议在专家包管理器上使用它们。如果你必须使用proprietry包管理器,那么有权访问它的包加载器是合理的!
如果这确实不令人满意,那么您可以按如下方式破解包加载程序(假设您使用* nix系统)。这是用zsh编写的shell脚本。如果你的系统没有那个可用的话,希望很明显你可以在支持的shell中重写它:
#!/bin/zsh
setopt extended_glob
function find_package_init_files () {
locate __init__.py
}
# Get the containing folder of a file or a folder
function file_or_folder_to_parent_folder () {
while read file_or_folder
do
echo ${file_or_folder:h}
done
}
# Exclude folders where the parent folder also has an __init__.py file in it
function exclude_inner_packages () {
while read init_file_folder
do
init_file_parent_folder=${init_file_folder:h}
if [ ! -e ${init_file_parent_folder}/__init__.py ]
then
echo ${init_file_folder}
fi
done
}
# This produces an array of all folders
# that contain at least one python package
function get_distinct_python_package_folders () {
find_package_init_files |
file_or_folder_to_parent_folder |
exclude_inner_packages |
file_or_folder_to_parent_folder |
sort |
uniq
}
PYTHONPATH=${(j/:/)$(get_distinct_python_package_folders)} YOUR_SCRIPT_HERE
您可能需要更新此脚本以将默认的python路径放在第一位,并记住这是一种非常笨拙的方法。如果系统上安装了多个版本的库,那么您可能最终使用的库将会定义不正确。
使用合适的软件包管理器,即使是专有的软件包管理器,也是最好的方法。