Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于配置文件中的路径导入模块_Python_Python 2.7_Python Import - Fatal编程技术网

Python 基于配置文件中的路径导入模块

Python 基于配置文件中的路径导入模块,python,python-2.7,python-import,Python,Python 2.7,Python Import,我有一个第三方模块(cx_Oracle),我想将其导入,其位置在不同的环境中是未知的。我目前正在使用pythons configparser,因此我认为在配置解析器中设置模块的位置,将该位置附加到路径,然后从那里导入第三方模块将是一个巧妙的技巧 在我开始重构代码并开始将逻辑拆分为它们自己的类/方法之前,这一切都很顺利: class Database: def __init__(self, config): self.CONFIG=config sys.p

我有一个第三方模块(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(以及数据库类中的所有其他方法)看到导入的模块


谢谢。

如果您只需要在该类中使用
cx\u 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()

作为旁注,如果您要创建多个
数据库
实例,这是一种奇怪的方法,因为您最终会将多个相同的条目添加到
sys.path

,这看起来像是混淆了导入模块、打开文件和/或连接到数据库。如果在已知位置没有要导入的模块,通常是非常糟糕的设计,您应该控制它。我不清楚,如果我没有弄错的话,您对`self.open()的
导入的
的预期范围只会在
\uuuu init\uuuu
中。我想您正在寻找
\uuu import\uu()
@JanVlcinsky我正在导入cx\u Oracle模块,以便与Oracle数据库通信。然后,我在self.open()方法中打开与该数据库的连接。我知道模块通常应该在已知的位置,也许我应该和我的IT团队谈谈,让模块安装在正确的位置。一般来说,我们各个团队之间的摩擦较少,只需将“您需要的一切”放在一个文件夹中即可。我遇到的问题是从另一个位置调用程序,也许这就是我工作过度的原因。@PatrickBateman我的评论可能太快了。有了甲骨文,有时可能会很困难。也许这个答案对您有帮助:数据库实例将被调用一次。在类内部有一个insert语句,我可以随时调用它。这是一个非常简单的程序,只是记录一些活动。你的答案就是我一直在寻找的;非常感谢。