相关疑难解决方法(0)

如何卸载(重新加载)Python模块?

我有一个长期运行的Python服务器,并希望能够在不重新启动服务器的情况下升级服务.这样做的最佳方法是什么?

if foo.py has changed:
    unimport foo  <-- How do I do this?
    import foo
    myfoo = foo.Foo()
Run Code Online (Sandbox Code Playgroud)

python module reload python-import

759
推荐指数
15
解决办法
59万
查看次数

强制python解释器重新加载代码模块

OpenERP python代码开发周期是编辑代码,重启服务器并测试它.重新启动服务器是必要的,因为它是使源代码重新加载到内存中的原因,但它会增加工作节奏的烦人延迟.

由于python是一种动态语言,我想知道是否有办法强制运行python解释器(应用服务器)动态重新加载代码模块,以便可以在不重新启动应用服务器的情况下测试它?

更新: 按照reload@ecatmur建议的路径,我得到了下面的代码,但它仍然无法正常工作:

class module(osv.osv):
    _inherit = "ir.module.module"

    def action_reload(self, cr, uid, ids, context=None):
        for obj in self.browse(cr, uid, ids, context=context):
            modulename = 'openerp.addons.' + obj.name
            tmp = __import__(modulename)
            pycfile = tmp.__file__
            modulepath = string.replace(pycfile, ".pyc", ".py")
            code=open(modulepath, 'rU').read()
            compile(code, modulename, "exec")
            execfile(modulepath)
            reload( sys.modules[modulename] )
        openerp.modules.registry.RegistryManager.delete(cr.dbname)
        openerp.modules.registry.RegistryManager.new(cr.dbname)
Run Code Online (Sandbox Code Playgroud)

python openerp

22
推荐指数
2
解决办法
7659
查看次数

Python - 以前导入了如何删除/ unmport libs

我们知道,在python 2.x中,如果我们划分两个整数值,它会产生一个int.但是,如果使用from __future__ import division,我们会获得一个float值.

>>> 3/2
1
>>> from __future__ import division
>>> 3/2
1.5
>>> 
>>> 
>>> 3//2
1
>>> 4/3
1.3333333333333333
>>> 
Run Code Online (Sandbox Code Playgroud)

所以,如果我们想在导入后想要整数,//而不是/应该使用__future__.division,但我想知道如何/再次返回整数.

有没有办法取消导入或删除以前导入的模块?


有一种方法可以在IDLE中取消导入库或模块,即使用Ctrl + F6或菜单中的选项重新启动它

python

10
推荐指数
2
解决办法
2万
查看次数

Python不会显示导入文件的代码更改

我使用的是linux python shell,每次我对导入的文件进行更改时,我都需要重新启动shell(我尝试重新导入文件,但没有反映出更改)

我在一个名为handlers.py的文件中有一个定义

def testme():
    print "Hello I am here"
Run Code Online (Sandbox Code Playgroud)

我在python shell中导入文件

>> import handlers as a
>> a.testme()

>>  "Hello I am here"
Run Code Online (Sandbox Code Playgroud)

然后我将print语句更改为"你好我在那里",重新导入处理程序,它没有显示更改?

使用带有Mint 17.1的Python 2.7

python import

4
推荐指数
1
解决办法
2774
查看次数

除非我重置内核,否则对象不会在 Jupyter Notebook 中“重置”

这是一个奇怪的问题,我不完全确定如何恰当地提出问题,但我会尽力而为。

我有一个自定义类,它基本上是一个 API 的包装器,它在每次调用时使用新数据更新 SQLite 数据库(我无法将其添加到问题中,因为它是庞大且私密的)。

奇怪的是,似乎有些信息正在被缓存(我认为这是不可能的,但这是它让我想起的唯一一件事,比如当你在 web dev 中进行编辑但他们没有更新时)因为它首先起作用时间,但是当我尝试重新初始化对象并再次运行它时,它不会向数据库添加任何新数据(当我知道有新数据要添加时)。

我知道代码有效,因为如果我重新启动内核并再次运行它,它更新没有问题。

我尝试删除对象 ( del InitializedClass)、重新初始化并使用不同的值进行初始化,但似乎没有任何效果。除非重新启动内核,否则它不会更新数据库。

有没有人遇到过这样的问题?如果这还不够,我很乐意提供更多信息,但我不知道如何描述它。

谢谢!!


编辑

下面的伪代码基本上就是正在发生的事情

from something import SomeClass    

while True:

    obj = SomeClass() #      <---------  How can I "reset" this on each loop?

    obj.get_new_data_from_api()
    obj.update_raw_db()
    obj.process_raw_data()
    obj.update_processed_db()

    # i tried different combinations of deleting the object
    del obj
    del SomeClass
    from something import SomeClass
Run Code Online (Sandbox Code Playgroud)

编辑2:

所以正如大家所提到的,这是类本身的问题,但我仍然不明白为什么会发生错误。基本上,end当我将datetime.now()函数调用作为默认 kwarg(即使在删除类并创建新实例之后,这并没有)更新)。该问题如下图所示:

class SomeBrokenClass():

    def __init__(self):    
        pass

    def get_endpoint(self, start, end):
        return 'https://some.api.com?start_date=%s&end_date=%s' % (start, …
Run Code Online (Sandbox Code Playgroud)

python class ipython python-3.x jupyter-notebook

1
推荐指数
1
解决办法
1728
查看次数