根据配置文件中的路径导入模块

0 投票
1 回答
791 浏览
提问于 2025-04-18 04:48

我有一个第三方模块(cx_Oracle),它的位置在不同的环境中是未知的。我现在使用的是Python的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类中的其他方法)都能看到这个导入的模块呢?

谢谢。

1 个回答

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 里添加多个一模一样的条目。

撰写回答