【问题标题】:Import module based on path within a config file根据配置文件中的路径导入模块
【发布时间】:2014-06-15 22:24:44
【问题描述】:

我有一个第三方模块 (cx_Oracle),我想导入它的位置在不同环境之间是未知的。我目前正在使用 pythons configparser,所以我认为在配置解析器中设置模块的位置,将该位置附加到路径,然后从那里导入第三方模块是一个巧妙的技巧。

在我开始重构我的代码并开始将逻辑拆分为他们自己的类/方法之前,这一切都很好而且花花公子:

class Database:

    def __init__(self, config):
        self.CONFIG=config
        sys.path.append(self.CONFIG.cx_oracle_path)
        from cx_Oracle import cx_Oracle

        self.open()

    def open(self):
        self.CONNECTION = cx_Oracle.Connection(self.CONFIG.username,
        self.CONFIG.password,
        self.CONFIG.db_sid)
        self.CURSOR = self.CONNECTION.cursor()
     ....
     ....
     ....

当然,open 方法不知道要做什么,因为 cx_Oracle 是在 init 中定义的,所以 open 方法看不到它。

我无法想象正确的方法来做到这一点,所以我假设我想多了。我应该怎么做才能让 open(以及 Database 类中的所有其他方法)可以看到导入的模块?

谢谢。

【问题讨论】:

  • 您似乎对导入模块、打开文件和/或连接数据库感到困惑。在已知位置没有要导入的模块通常是非常糟糕的设计,您应该控制它。我不清楚你对 `self.open() 的期望
  • 如果我没记错的话,你的import 只会在__init__ 内有作用域。我想你正在寻找__import__()
  • @JanVlcinsky 我正在导入 cx_Oracle 模块,以便可以与 Oracle 数据库通信。然后,我在 self.open() 方法中打开与该数据库的连接。我知道模块通常应该位于已知位置,也许我应该与我的 IT 团队沟通,将模块安装在正确的位置。通常,我们各个团队之间的摩擦较少,只需将“您需要的一切”放在一个文件夹中即可。我遇到的问题是从不同的位置调用程序,也许那是我自己过度工作的地方。
  • @PatrickBateman 我的评论可能太快了。使用 Oracle 有时可能会很困难。可能这个答案可以帮助你:stackoverflow.com/a/4784441/346478

标签: python python-2.7 python-import


【解决方案1】:

如果您只需要在该类中使用cx_Oracle,则可以将其设置为该实例的属性,例如:

class Database:

    def __init__(self, config):
        self.CONFIG=config
        sys.path.append(self.CONFIG.cx_oracle_path)
        from cx_Oracle import cx_Oracle
        self.cx_Oracle = cx_Oracle
        self.open()

    def open(self):
        self.CONNECTION = self.cx_Oracle.Connection(self.CONFIG.username,
                                                    self.CONFIG.password,
                                                    self.CONFIG.db_sid)
        self.CURSOR = self.CONNECTION.cursor()

附带说明,如果您要创建多个 Database 实例,这是一种奇怪的方法,因为您最终会向 sys.path 添加多个相同的条目。

【讨论】:

  • 数据库实例将被调用一次。在类里面有一个插入语句,我会在需要时调用它。这是一个非常简单的程序,它只是记录一些活动。你的答案就是我想要的;谢谢。
猜你喜欢
  • 2017-06-26
  • 2019-01-27
  • 2011-03-30
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
相关资源
最近更新 更多