加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:46:44 所属栏目:Python 来源:网络整理
导读:我是 Python的新手.我在一家公司,他们用Python构建了一个大型系统.他们使用专有系统来管理系统运行时的路径,但现在我被要求构建一个独立的脚本,与系统中的某些代码进行交互.遗憾的是,我的独立脚本不会在他们使用的路径管理器下运行,所以我需要自己弄清楚路径
我是 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安装之前,我们根本不依赖于全局安装.

解决方法

最佳解决方案可能是 virtualenv或 virtualenvwrapper.这将允许您定义包含脚本所需的所有库的环境.这不是全球性的.

这可以按如下方式完成:

>创建定义所需库的requirements.txt file
>安装pip和virtualenvwrapper
>来源/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库将环境安装到项目的文件夹中.除此之外,它们是等价的.

我真的建议在专家包管理器上使用它们.如果您必须使用专有包管理器,那么可以访问包加载器是合理的!

如果这真的不令人满意,那么您可以按如下方式破解包加载程序(假设您使用* 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路径放在第一位,并记住这是一种令人难以置信的笨拙方法.如果系统上安装了多个版本的库,那么您最终可能使用的库将会定义不正确.

使用合适的包管理器,即使这是专有的包管理器,也是最好的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读