gunicorn 编译 python 来源
gunicorn with compiled python source
我已经在 centOS 7 上用 PyInstaller 编译了我的 python 文件,包括 gunicorn。我正在尝试 运行 在另一台 centOS 7 机器上 运行 这些可执行文件,但我得到 ModuleNotFoundError: No module named 'manage'
但是我的模块 manage
以可执行形式存在于同一目录中。这是完整的命令及其输出。
./gunicorn -c /opt/myproject/configuration/gunicorn_conf.ini --bind unix:/etc/myproject/myproject.sock -m 007 manage:app --preload
!!!
!!! WARNING: configuration file should have a valid Python extension.
!!!
Traceback (most recent call last):
File "gunicorn", line 8, in <module>
File "site-packages/gunicorn/app/wsgiapp.py", line 58, in run
File "site-packages/gunicorn/app/base.py", line 228, in run
File "site-packages/gunicorn/app/base.py", line 72, in run
File "site-packages/gunicorn/arbiter.py", line 58, in __init__
File "site-packages/gunicorn/arbiter.py", line 118, in setup
File "site-packages/gunicorn/app/base.py", line 67, in wsgi
File "site-packages/gunicorn/app/wsgiapp.py", line 49, in load
File "site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
File "site-packages/gunicorn/util.py", line 358, in import_app
File "importlib/__init__.py", line 127, in import_module
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'manage'
[20316] Failed to execute script gunicorn
我是不是漏掉了什么?或 gunicorn 不适用于已编译的文件?如果没有,那么除了使用源代码之外还有其他选择吗?
我有一个类似的问题,gunicorn.glogger
的导入失败。我通过明确地将导入添加到模块的顶部来解决它。
from gunicorn import glogger
我正在使用 gunicorn 20.0.4,但没有看到名为 manage
的模块。这可能是另一个库的依赖项吗?
另一个可能的修复
隐藏导入在 pyinstaller docs 中指定,您可以在构建命令中使用开关 --hidden-import
以在二进制文件中包含隐式使用的库。如果您有多个导入,您可以使用 :
来分隔列表。
调用 GUnicorn
Green unicorn 专为从命令行启动而构建。这在 docker 容器内或通过主机上的 运行 命令很容易做到。不幸的是,使用 pyinstaller 时情况并非如此,因为您需要一个“python”入口点。我必须从 gunicorn docs (copy/paste) 构建自定义应用程序以允许我的应用程序作为脚本启动。从这里我可以告诉 pyinstaller 使用这个脚本在 if __name__ == '__main__':
下启动服务器
参见下面的示例。
错误
即使是使用所需依赖项构建的二进制文件,我 运行 遇到了一个问题,即 Web 应用程序在 运行dom 请求数后会停止响应。我没有进一步调查,因为它把我推向了构建 RPM 以便于安装的另一个方向。
2021 年 2 月 4 日更新
正在为 GUnicorn 设置参数。
import gunicorn.app.base
class StandaloneApplication(gunicorn.app.base.BaseApplication):
def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super().__init__()
def load_config(self):
config = {key: value for key, value in self.options.items()
if key in self.cfg.settings and value is not None}
for key, value in config.items():
self.cfg.set(key.lower(), value)
def load(self):
return self.application
if __name__ == '__main__':
options = {
'bind': 'unix:/etc/myproject/myproject.sock',
'preload': True,
'config': '/opt/myproject/configuration/gunicorn_conf.ini',
'umask': '007',
'<argument name>': '<argument value>',
}
StandaloneApplication(<your flask application object or factory>, options).run()
尚未测试此特定设置,但我使用的是非常相似的设置。 CLI 中的每个 GUnicorn switch/option 直接映射到 python 变量,你可以找到 here。这些选项在我们的 options
字典中设置,服务器将接受这些选项作为 StandaloneApplication
构造函数中的第二个参数。您需要将 app
对象作为 manage
模块的第一个参数或应用程序工厂函数传入。
我确实建议查看 python configuration files。您还可以将它们导出为环境变量并使用 os.getenv("<env name>")
来访问它们。它只是防止服务器使用其他用户必须在源中更改的硬编码值。
我已经在 centOS 7 上用 PyInstaller 编译了我的 python 文件,包括 gunicorn。我正在尝试 运行 在另一台 centOS 7 机器上 运行 这些可执行文件,但我得到 ModuleNotFoundError: No module named 'manage'
但是我的模块 manage
以可执行形式存在于同一目录中。这是完整的命令及其输出。
./gunicorn -c /opt/myproject/configuration/gunicorn_conf.ini --bind unix:/etc/myproject/myproject.sock -m 007 manage:app --preload
!!!
!!! WARNING: configuration file should have a valid Python extension.
!!!
Traceback (most recent call last):
File "gunicorn", line 8, in <module>
File "site-packages/gunicorn/app/wsgiapp.py", line 58, in run
File "site-packages/gunicorn/app/base.py", line 228, in run
File "site-packages/gunicorn/app/base.py", line 72, in run
File "site-packages/gunicorn/arbiter.py", line 58, in __init__
File "site-packages/gunicorn/arbiter.py", line 118, in setup
File "site-packages/gunicorn/app/base.py", line 67, in wsgi
File "site-packages/gunicorn/app/wsgiapp.py", line 49, in load
File "site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
File "site-packages/gunicorn/util.py", line 358, in import_app
File "importlib/__init__.py", line 127, in import_module
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'manage'
[20316] Failed to execute script gunicorn
我是不是漏掉了什么?或 gunicorn 不适用于已编译的文件?如果没有,那么除了使用源代码之外还有其他选择吗?
我有一个类似的问题,gunicorn.glogger
的导入失败。我通过明确地将导入添加到模块的顶部来解决它。
from gunicorn import glogger
我正在使用 gunicorn 20.0.4,但没有看到名为 manage
的模块。这可能是另一个库的依赖项吗?
另一个可能的修复
隐藏导入在 pyinstaller docs 中指定,您可以在构建命令中使用开关 --hidden-import
以在二进制文件中包含隐式使用的库。如果您有多个导入,您可以使用 :
来分隔列表。
调用 GUnicorn
Green unicorn 专为从命令行启动而构建。这在 docker 容器内或通过主机上的 运行 命令很容易做到。不幸的是,使用 pyinstaller 时情况并非如此,因为您需要一个“python”入口点。我必须从 gunicorn docs (copy/paste) 构建自定义应用程序以允许我的应用程序作为脚本启动。从这里我可以告诉 pyinstaller 使用这个脚本在 if __name__ == '__main__':
参见下面的示例。
错误
即使是使用所需依赖项构建的二进制文件,我 运行 遇到了一个问题,即 Web 应用程序在 运行dom 请求数后会停止响应。我没有进一步调查,因为它把我推向了构建 RPM 以便于安装的另一个方向。
2021 年 2 月 4 日更新
正在为 GUnicorn 设置参数。
import gunicorn.app.base
class StandaloneApplication(gunicorn.app.base.BaseApplication):
def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super().__init__()
def load_config(self):
config = {key: value for key, value in self.options.items()
if key in self.cfg.settings and value is not None}
for key, value in config.items():
self.cfg.set(key.lower(), value)
def load(self):
return self.application
if __name__ == '__main__':
options = {
'bind': 'unix:/etc/myproject/myproject.sock',
'preload': True,
'config': '/opt/myproject/configuration/gunicorn_conf.ini',
'umask': '007',
'<argument name>': '<argument value>',
}
StandaloneApplication(<your flask application object or factory>, options).run()
尚未测试此特定设置,但我使用的是非常相似的设置。 CLI 中的每个 GUnicorn switch/option 直接映射到 python 变量,你可以找到 here。这些选项在我们的 options
字典中设置,服务器将接受这些选项作为 StandaloneApplication
构造函数中的第二个参数。您需要将 app
对象作为 manage
模块的第一个参数或应用程序工厂函数传入。
我确实建议查看 python configuration files。您还可以将它们导出为环境变量并使用 os.getenv("<env name>")
来访问它们。它只是防止服务器使用其他用户必须在源中更改的硬编码值。