Python 库的行为因安装与否而异

Python 库的行为因安装与否而异,python,Python,我编写了一个Python库,它一直在困扰着我。我有一组变量可以改变库的工作方式。在测试中,这一切都很好,但是当我安装pythonlib.py时,变量对库没有影响。我将其分解为最简单的示例: 图书馆: ##lib.py config="Original" def run(): print config 脚本: import lib lib.config="New" lib.run() print lib.config

我编写了一个Python库,它一直在困扰着我。我有一组变量可以改变库的工作方式。在测试中,这一切都很好,但是当我安装pythonlib.py时,变量对库没有影响。我将其分解为最简单的示例:

图书馆:

    ##lib.py
    config="Original"

    def run():
        print config
脚本:

    import lib

    lib.config="New"
    lib.run()
    print lib.config
import init

init.config = 'New'
init.run()
print init.config
如果将库放置在与脚本相同的目录中并运行它,则输出为:

    New
    New
    Original
    New
但如果安装库,然后使用dist包中的库尝试脚本,则输出为:

    New
    New
    Original
    New
有人能解释一下发生了什么事吗?我有点困惑,对发生的事情和原因非常感兴趣。另外,我的程序配置是否完全错误

编辑

原来问题出在init.py文件上。这基本上就像导入一个库而只导入另一个库一样。导入已安装的模块时,它会查看文件夹
lib
和文件init.pyinit.py只是lib import*中的一行代码。它只是假装是实际的库,但如果使用全局变量,则会导致一个奇怪的问题。基本情况的模拟示例:

##init.py
from lib import *
脚本:

    import lib

    lib.config="New"
    lib.run()
    print lib.config
import init

init.config = 'New'
init.run()
print init.config
输出:

Original
New

函数run()在lib.py中查找
config
,但在init.py中查找
print init.config
。谢谢大家的帮助。修复方法是更改模块的安装方式(noinit.py)。最后,我希望删除所有全局变量,但目前一切都很完美。

您所描述的内容与Python的工作方式不一致(如果您愿意,请阅读“我不相信您确实做到了这一点,也没有得到确切的结果”)


但是,如果您从不同的地方或以不同的方式导入
lib
,您可能会得到它的两个副本,一个是模块的两个副本,一个是当前目录
lib
,另一个是已安装的
lib
。如果您获得这种“原始”/“新”行为,在我看来,这似乎是最可能的原因。

配置通常应为每个对象实例,而不是静态(全局),除非有很好的理由静态执行。即使这样,对象实例也应该支持覆盖任何类型的全局配置。此外,我无法在Python 2.6.6上重现这种行为。@尝试使用您所描述的内容似乎不合理。我也认为这可能是原因。所以我没有给这两个库取相同的名字。我也同意你的看法,Python不是这样工作的,这就是为什么我对此感到惊讶的原因。@trydyingtolive:那么,为了找到它,请在使用它的地方打印lib,并比较路径;如果它们相同,则开始比较模块对象标识。查看
sys.modules
也会有所帮助。我看到的最大区别是,当您从同一目录运行它时,它是作为lib.pyc运行的,当您从已安装的运行它时,您是从init.pyc运行的。init所做的就是导入*.init就是问题所在。如果我创建一个名为init.py的新文件,该文件从lib.py导入*并导入init,则会出现相同的问题。@trydyingtolive:“如果我创建一个名为init.py的新文件,该文件导入”???你在说什么?请将问题更新为非常、非常准确和完整的,关于您当前目录中的每个文件。细节很重要。准确性很重要。