我们目前在我们的服务器上为几百个小型PHP站点运行一个小型共享托管服务.我们也想提供Python支持,但至少从我们的初步研究来看,每次源代码更改后似乎都需要重启服务器.
这是真的吗?如果是这样,我们就无法提供Python托管支持.让我们的客户能够上传文件很容易,但我们不能让他们重新启动(共享)服务器进程!
PHP很简单 - 上传新版本的文件,运行新版本.
我非常尊重Python语言和社区,所以很难相信它真的需要一个疯狂的过程来更新网站的代码.请告诉我,我错了!:-)
我正在创建一个下载并安装自己的egg插件的应用程序,但是在easy_install将其提取到位后,我在加载鸡蛋时遇到问题.这是它现在的工作方式:
问题是在重新启动python进程之前不会重新加载pth,这意味着必须停止并重新启动应用程序(app是一个长时间运行的进程,并且插件安装不需要重新启动).
所以问题是如何以编程方式重新加载pth以便插件入口点发现适用于新蛋,或者以某种方式让easy_install返回它安装egg的路径,因此我可以手动(使用pkg_resources)加载新插件?
我可以创建一个函数,试图猜测easy_install的路径或者自己解析pth,但我不愿意,如果可能的话.
Python 2.6,setuptools 0.6c9
感谢Marius Gedminas,我现在所做的基本上是:
dist = pkg_resources.get_distribution(plugin_name)
entry = dist.get_entry_info(entry_point_name, plugin_name)
plugin = entry.load()
Run Code Online (Sandbox Code Playgroud) 我正在编写一个具有嵌入式 Python 解释器的应用程序,但也可以从应用程序内运行脚本文件。
我想要归档的是有一种方法可以重置解释器,或者它可以在不影响全局环境的情况下执行文件/语句,这样您就可以运行脚本,编辑文件并再次运行脚本,而无需在中间完成Python(或重置我的口译员)。
我尝试创建一个新的解释器,但有时它会挂起整个应用程序(死锁)。这是一个小演示来查看问题。
Py_Initialize();
PyThreadState* pGlobalThreadState = PyThreadState_Get();
PyThreadState* pInterpreterThreadState = Py_NewInterpreter();
PyThreadState_Swap(pInterpreterThreadState);
PyRun_SimpleString("import PySide"); // Importing PySide deadlocks
Py_EndInterpreter(pInterpreterThreadState);
PyThreadState_Swap(pGlobalThreadState);
Run Code Online (Sandbox Code Playgroud)
如果我保存 GIL 状态,它有时会起作用,但根据文档,不支持与 Py_NewInterpreter 一起使用。
使用Python 3.4。
是否有其他解决方案可以在单独的环境中运行命令或修复死锁?
在python中创建高度集成的代码很容易,因此在代码更改时退出并重新启动应用程序的需求是可以理解的.
但是,肯定必须存在一些策略和模型才能隔离部分代码,以便在不需要退出和重新启动的情况下即时更新.
对于我正在处理的应用程序,许多功能将是主应用程序将与之通信的独立后台任务,呈现状态信息以及指示基于当前状态执行任务.在许多方面,这些后台任务可以被视为独立程序,只是它们与主应用程序以及构建在其上的其他工具,任务等共享一些代码库.
虽然可能很难让整个shebang实时更新,但我确信必须有可能推出更新并让运行代码根据需要注意和更新自身的方法.
由于我也热衷于利用多线程和asyncio(在Python 3.5中),以及探索使事情无状态,在逻辑上可以在这里做一些有趣的事情,至少可以避免一些强制重启时推出新代码.
非常感谢有关如何使其工作的信息的提示和指示.
假设您使用名为 my_func() 的函数创建了一个名为 funcs 的 py 文件。
在使用 Jupyter Notebook 时,您希望使用以下内容导入所述函数:
from funcs import my_func
Run Code Online (Sandbox Code Playgroud)
现在你用它做一些事情,即
x = my_func(bla)
Run Code Online (Sandbox Code Playgroud)
之后,您要从 my_func 修改一些内容。所以我改变它并保存它。如果我重新运行上面发布的代码,将看不到更改,因此我必须重新启动内核以运行具有上述更改的功能。有没有有效的方法来做到这一点?
注意:我知道 reload 模块允许您重新加载整个 funcs py 文件,但我想在更具体的函数级别执行此操作。不是整个剧本。通过重新加载,我将不得不导入 funcs 而不仅仅是 my_func,因此必须编写
x = funcs.my_func(bla)
Run Code Online (Sandbox Code Playgroud)
这不是我的目标。
回答:
import sys, importlib
importlib.reload(sys.modules['funcs])
from funcs import my_func
Run Code Online (Sandbox Code Playgroud) 我有一个Python模块测试,我想编辑测试并在解释器上运行一些测试功能。Python是否会在不重新导入的情况下自动查看我在测试中编辑的功能的差异?这个动作的合适词是什么?
编辑到目前为止,没有任何内容在起作用,因此我将发布更多详细信息:
我的模块中有一个类,称为Test。所以我用了这个说法from test import Test。现在,当我尝试命令时reload(test),解释器告诉我重载是未定义的。如果我这样做,import imp那么imp.reload(test)解释器会告诉我这test是未定义的。这是怎么了?
我正在module使用python的unittest框架为python模块编写单元测试.
该模块在加载时使用json文件进行一些"预处理",因此它具有以下内容:
module.info['xyz']可以访问和使用它.
在为此编写测试时,我想在每次测试之前重新加载模块,以便module.info在开始当前测试之前,对于每个测试,字典的旧键不再存在.
现在我有一个reload(module)在setUp()但这似乎并没有做的伎俩.我有罗纳尔多,也很想通过引进旧密钥test_A在其他测试,如test_B和test_C那些后执行.
我想知道是否有办法实现我想要实现的目标,或者您是否可以指出我的文档说它无法完成.
对我来说很明显,Python 2中没有干净的解决方案来卸载模块,这是一个已知的错误,已被纠正。
帖子:
如何卸载(重新加载)Python模块? 删除导入的python模块
2009年和2010年的报告证实了缺少对模块卸载的支持。
我想知道这是否在Python 3.x中得到了解决。当我这样做,import os,del os,dir(),该os模块是不存在(至少不可见,可用)。没了吗
我在名为函数的文件夹中有一个文件 readfunctions.py(在这个文件夹中还有一个“ init .py”文件)。在文件 readfunctions.py 中,我定义了一个名为“read_from_shower”的函数。
./functions
readfunctions.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
所以,我在我的 Google Colab 会话中导入了这个(在我克隆存储库后从 GitHub 中):
from functions.readfunctions import read_from_shower
Run Code Online (Sandbox Code Playgroud)
它工作正常。但是,我对我的函数“read_from_shower”做了一些更改,但我可以在 Colab 中重新加载它。
我该怎么做?
我正在做一些故障排除,我很好奇是否可以交互式运行 python 脚本,更改脚本中定义的函数,保存文件,然后让交互式 shell 识别更改。这是我目前正在做的一个例子:
my_script.py:
def dummy_func():
print('Something')
def main():
dummy_func()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
我去我的终端并运行:
>python -i my_script.py
Something
>>>
Run Code Online (Sandbox Code Playgroud)
如果我在编辑器中返回 my_script.py 并进行以下更改:
def dummy_func():
print('Something else')
Run Code Online (Sandbox Code Playgroud)
然后返回终端(仍处于打开状态)并重新运行更新后的函数:
>>>dummy_func()
Something
>>>
Run Code Online (Sandbox Code Playgroud)
是否有可能做一些事情来代替获得以下行为?:
>>>dummy_func()
Something else
>>>
Run Code Online (Sandbox Code Playgroud)
我知道可以使用 importlib 和 reload 重新加载模块,但据我所知,这不适用于这里,因为我没有导入任何东西。我对 stackoverflow 还很陌生,所以如果我需要提供更多详细信息或以不同的方式提问,请告诉我。谢谢。
编辑; 我认为这可能与如何卸载(重新加载)Python 模块不同?.
我在问是否有办法重新加载您正在通过 python shell 交互运行的当前文件,而那个问题是关于重新加载您已导入另一个 python 脚本的模块。我编辑了我的答案以包含对这个问题的引用。
python ×9
module ×2
python-3.x ×2
egg ×1
import ×1
interactive ×1
python-3.5 ×1
reload ×1
setuptools ×1
stateless ×1
testing ×1
web-hosting ×1