如何控制Python中的导入路径?

2024-06-09 14:30:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手。我在一家公司,他们用Python构建了一个大型系统。他们使用一个专有系统来管理系统运行时的路径,但是现在我被要求构建一个独立的脚本,与他们系统中的一些代码交互。遗憾的是,我的独立脚本不会在他们使用的路径管理器下运行,所以我需要自己找出路径。在

例如,我有这样一句话:

from hark.tasks import REPLY_LINE

这实际上是从他们的一些旧代码复制的。在本例中,脚本可以找到hark,但是hark有一个__init__.py文件,这就是问题的开始。所以我得到这个:

^{pr2}$

他们建造的项目实际上包括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了解不多,但我想知道Python是否是一种惯用的Python方法,可以包含在如此遥远的目录中的包?在

而且,在任何人建议pip install之前,我们根本不依赖全局安装。在


Tags: 代码路径脚本管理器libpackages系统site
1条回答
网友
1楼 · 发布于 2024-06-09 14:30:52

最好的解决方案可能是virtualenv或{a2}。这将允许您定义一个包含脚本所需的所有库的环境。这不会是全球性的。在

可按如下方式进行:

  • 创建一个requirements.txt file来定义所需的库
  • 安装pip和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将环境安装到主目录中的一个文件夹中。普通virtualenv库将环境安装到项目中的文件夹中。除此之外,它们是等价的。在

我真的建议你用它们而不是一个合适的包管理器。如果您必须使用适当的包管理器,那么它是合理的访问包加载器为它!在

如果这真的不令人满意,那么您可以按如下方式破解包加载器(假设您使用的是*nix系统)。这是一个用zsh编写的shell脚本。如果您的系统没有可用的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路径放在第一位,并记住这是一种非常笨拙的方法。如果一个系统上安装了多个版本的库,那么您可能最终使用的库将是定义错误的。在

使用一个合适的包管理器,即使这是最恰当的方法,也是最好的方法。在

相关问题 更多 >