Python 2.7 迁移到较新操作系统和Python版本的web服务器无法运行Pylons web应用程序

Python 2.7 迁移到较新操作系统和Python版本的web服务器无法运行Pylons web应用程序,python-2.7,virtualenv,python-2.6,pylons,Python 2.7,Virtualenv,Python 2.6,Pylons,我们将托管web服务器从较旧的centos 5.5、apache 2.2、python 2.5或2.6迁移到最新版本centos、apache 2.4、python 2.7。我们的主要web应用程序是用Python2.6编写的。并位于/home/下。托管公司没有把目录移过去,所以我们把它们移过去。解压tar并运行.sh启动paster和web应用程序。现在获取这些错误,但不确定从何处开始 Could not find platform independent libraries <pref

我们将托管web服务器从较旧的centos 5.5、apache 2.2、python 2.5或2.6迁移到最新版本centos、apache 2.4、python 2.7。我们的主要web应用程序是用Python2.6编写的。并位于/home/下。托管公司没有把目录移过去,所以我们把它们移过去。解压tar并运行.sh启动paster和web应用程序。现在获取这些错误,但不确定从何处开始

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
'import site' failed; use -v for traceback
Traceback (most recent call last):
  File "/home/webapp/pylons-env/bin/paster", line 5, in <module>
    from pkg_resources import load_entry_point
ImportError: No module named pkg_resources
多亏了Audrius的帖子,我取得了一些进步。需要注意的是:没有requirements.txt,所以我安装了挂架并安装在setup.py上。当我尝试启动应用程序时,我必须指定/home/webapp/pylons env/bin/paster,因为现在系统/bin/中有一个粘贴程序,如果我只是做一个粘贴服务,它就会使用它。我确实删除了/home/webapp/中的挂架env并重新安装。如果我运行上面的.sh脚本,我只会收到一条“进入守护程序模式”消息,但粘贴程序进程从未启动(我已将其更新为在/home/webapp中指定粘贴程序)。我想我应该试着在文档中使用标准:

/home/webapp/pylons-env/bin/paster serve /home/webapp/app/prod-mt.ini
我明白了:

[root@58ck-6gpy me]# /home/webapp/pylons-env/bin/paster serve /home/webapp/app/prod-mt.ini
Traceback (most recent call last):
  File "/home/webapp/pylons-env/bin/paster", line 9, in <module>
load_entry_point('PasteScript==2.0.2', 'console_scripts', 'paster')()
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/script/command.py", line 102, in run
invoke(command, command_name, options, args[1:])
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/script/command.py", line 141, in invoke
exit_code = runner.run(args)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/script/command.py", line 236, in run
result = self.command()
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/script/serve.py", line 284, in command
relative_to=base, global_conf=vars)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/script/serve.py", line 329, in loadapp
**kw)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 247, in loadapp
return loadobj(APP, uri, name=name, **kw)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 271, in loadobj
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 296, in loadcontext
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 320, in _loadconfig
return loader.get_context(object_type, name, global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 454, in get_context
section)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 476, in _context_from_use
object_type, name=use, global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 406, in get_context
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 296, in loadcontext
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 320, in _loadconfig
return loader.get_context(object_type, name, global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 454, in get_context
section)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 476, in _context_from_use
object_type, name=use, global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 406, in get_context
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 296, in loadcontext
global_conf=global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 328, in _loadegg
return loader.get_context(object_type, name, global_conf)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 620, in get_context
object_type, name=name)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 646, in find_egg_entry_point
possible.append((entry.load(), protocol, entry.name))
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "/home/webapp/app/client/config/middleware.py", line 8, in <module>
from pylons.error import error_template
ImportError: cannot import name error_template
正在进行中,但粘贴程序将不会在新服务器上启动。这是运行上面的.sh时的输出:

cat: paster.pid: No such file or directory
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Entering daemon mode

然后我执行了
top
,但没有看到进程正在运行。

问题似乎是,与webapp一起,您提取了一个旧的Python虚拟环境(
/home/webapp/pylons env
),它期望旧服务器提供Python版本。为了解决此问题,您需要重新创建虚拟环境并安装webapp所需的软件包

首先,您需要在服务器中安装
virtualenv
(如果尚未安装)。我不太了解CentOS,因此包名可能不同:

sudo yum安装python virtualenv
然后删除旧的虚拟环境并创建新的虚拟环境:

rm-rf/home/webapp/pylons环境
virtualenv/home/webapp/pylons环境
我不知道你的webapp的所有依赖项是如何安装在旧的virtualenv中的,但现在常用的方法是使用新创建的virtualenv中包含的
pip
工具。如果您看到位于webapp旁边的
requirements.txt
文件(保存所有依赖项列表的常用位置),请尝试运行:

/home/webapp/pylons env/bin/pip install-r requirements.txt
否则,您可以自己在命令行中输入依赖项的名称(这至少是
Pylons
,可能是其他的):

/home/webapp/pylons env/bin/pip安装挂架
如果您的Web应用程序在
setup.py
文件中包含依赖项,则可以执行此操作(请注意末尾的点):

#假设setup.py位于/home/webapp/app:
cd/home/webapp/app
/主页/webapp/pylons-env/bin/pip安装。
这将把webapp及其依赖项安装到virtualenv中

这些是将软件包安装到virtualenv中的常见方法,您需要自己确定哪种方法最适合您的项目


不要担心这些方法中的任何一种都会破坏某些东西,因为虚拟环境在设计上与系统范围内的Python安装是隔离的,而且重新创建虚拟环境的成本也很低。

很大程度上要感谢Audrius,我们已经解决了所有问题。不得不重新创建virtualenv,为应用程序运行setup.py,最后不得不手动检查并安装每个依赖项。在bash脚本中,它创建了一个日志文件,所以我只是运行脚本并读取日志文件,以查看生成了哪些错误。在Google和Stack Overflow的帮助下,当我一次解决这些问题时,它最终到达了一个点,粘贴程序将加载应用程序。目前运行良好。

您能否发布启动Web应用程序的shell脚本的内容?我是否正确地理解了,在新服务器中,您既有操作系统附带的Python的系统范围安装,也有您保存在/home中的旧Python安装?是的,正确,有服务器附带的系统范围Python,安装来自/home web app目录中的旧服务器。用shell脚本更新了我的帖子。对于您的项目来说,当前的Pylons版本(1.0.2)似乎太新了。我认为0.10是最后一个在
挂架中有
error\u模板的版本。error
模块,但是我遇到了来自挂架依赖的其他库的更多错误。现在,您最好仔细检查旧服务器存档中的
/home/webapp/pylons env/lib/python*/site软件包
,将所有库及其版本记录到
requirements.txt
pylons==0.10
等等,每一行都是新行)并使用它进行安装。再次感谢您的帮助。我按照你说的去做了,现在新机器上有了旧版本。当我以
粘贴服务prod-mt.ini
运行时,它确实清除了大部分错误。但是,我尝试在旧服务器上执行相同的操作,并遇到了相同的错误。这让我相信,我在上面发布的.sh对于让应用程序运行至关重要。我已确保服务器之间的
粘贴器
激活
文件相同。不过,当我运行脚本时,粘贴过程从未在服务器上启动。我在运行.sh时用输出更新了上面的内容。为了澄清,我所说的“我试图在旧服务器上做同样的事情”是指我刚刚运行了
粘贴服务prod-mt.ini
,并在新服务器上得到了相同的错误。但是,bash脚本在旧服务器上运行良好,
paster
进程启动正常,但在新服务器上运行不正常。我按照您的指示进行了操作,并取得了一些进展。我又乱弄了大约4个小时,显然又卡住了。我有
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/paste/deploy/loadwsgi.py", line 640, in find_egg_entry_point
pkg_resources.require(self.spec)
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/pkg_resources.py", line 728, in require
needed = self.resolve(parse_requirements(requirements))
  File "/home/webapp/pylons-env/lib/python2.7/site-packages/pkg_resources.py", line 626, in resolve
raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: appClient
cat: paster.pid: No such file or directory
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Entering daemon mode