如何在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 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路径放在第一位,并记住这是一种令人难以置信的笨拙方法.如果系统上安装了多个版本的库,那么您最终可能使用的库将会定义不正确. 使用合适的包管理器,即使这是专有的包管理器,也是最好的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |