【问题标题】:python script runs in shared hosting ssh, but not in cron jobpython脚本在共享主机ssh中运行,但不在cron作业中
【发布时间】:2018-01-20 13:40:52
【问题描述】:

我有一个 godaddy 共享主机帐户,我的目标是使用它来让 python 脚本作为 cron 作业运行。我在本地主机上完成了所有工作,但是当上传到 godaddy 服务器时,我立即发现我的脚本导入的模块在服务器上不可用,并且安装它们会很棘手。幸运的是,我找到了这个很棒的教程:https://www.youtube.com/watch?v=pf2HS9gGI7k,然后我可以通过在 SSH 中使用以下命令更改 python 路径来成功安装模块:

cd ~
PYTHONPATH=$PYTHONPATH:/lib/python/
PYTHONPATH=$PYTHONPATH:$HOME/lib/python/

然后我通过 SSH 命令安装了模块:

cd ~
wget http://urladdressofthisparticularmodule.tar.gz
tar xvf thisparticularmodule.tar.gz
cd thisparticularmodulesfolderthatthelaststepmade/
python setup.py install --home=~

然后我通过 SSH 命令成功运行了我的 pythonscript:

cd ~
python /home/thisismygodaddyusername/public_html/thisismyscript.py

它识别出模块并运行脚本。 但是当我尝试将它作为 cronjob 运行时,我将 cronjob 命令设置为:

PYTHONPATH=$PYTHONPATH:$HOME/lib/python python /home/thisismygodaddyusername/public_html/thisismyscript.py

但脚本不起作用,并且 python 模块存在一些问题。所以我想我在这个 cronjob 命令中做的不对,可能与 python 路径有关。如果有人对如何更改此命令或我应该做什么有任何建议,我会非常放心。

然后我得到的很长的错误是:

File "/home/thisismygodaddyusername/public_html/thisismyscript.py", line 3, in <module>
  import MySQLdb
File "/home/thisismygodaddyusername/lib/python/MySQL_python-1.2.3-py2.7-linux-x86_64.egg/MySQLdb/__init__.py", line 19, in <module>

File "/home/thisismygodaddyusername/lib/python/MySQL_python-1.2.3-py2.7-linux-x86_64.egg/_mysql.py", line 7, in <module>
File "/home/thisismygodaddyusername/lib/python/MySQL_python-1.2.3-py2.7-linux-x86_64.egg/_mysql.py", line 3, in __bootstrap__
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 3147, in <module>
  @_call_aside
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 3131, in _call_aside
  f(*args, **kwargs)
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 3160, in _initialize_master_working_set
  working_set = WorkingSet._build_master()
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 657, in _build_master
  ws = cls()
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 650, in __init__
  self.add_entry(entry)
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 706, in add_entry
  for dist in find_distributions(entry, True):
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1966, in find_eggs_in_zip
  if metadata.has_metadata('PKG-INFO'):
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1488, in has_metadata
  return self.egg_info and self._has(self._fn(self.egg_info, name))
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1840, in _has
  return zip_path in self.zipinfo or zip_path in self._index()
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1717, in zipinfo
  return self._zip_manifests.load(self.loader.archive)
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1677, in load
  manifest = self.build(path)
File "/home/thisismygodaddyusername/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 1650, in build
  with zipfile.ZipFile(path) as zfile:
AttributeError: ZipFile instance has no attribute '__exit__'

我不知道这是否会影响事情,但是如果我在 SSH 中执行命令:

cd ~
cd lib
ls

我明白了:

./  ../  __init__.py  python/  python2.6/  python2.7/

我所有的模块似乎都安装在上面的“python/”文件夹中 在我疯狂地尝试弄清楚如何执行这个 python 脚本 cronjob 项目时,我之前可能已经安装了这些 python2.6/python2.7/ 文件夹,我认为其中包含 python2.6 和 python2.7

作为一个附带问题,作为一个对 Linux 和 ssh 命令知识有限的新手程序员,想要实现通过 cron 作业在 Web 主机上运行 python 脚本的想法,以前从未这样做过,会是什么解决这个问题的正确方法,与我刚刚开始并尝试在我通过谷歌搜索进行时弄清楚的做法相反?我想我在问什么是最有效的方法来学习我需要知道的关于共享主机上的 cronjobs 以及必须以这种有趣的方式安装模块的问题。如果 godaddy 能提供一个简短的概述,那就太好了。

【问题讨论】:

    标签: python module cron shared-hosting pythonpath


    【解决方案1】:

    cron 作业在哪个用户下运行?该用户的环境中是否有 $HOME 变量?应该不会吧。

    恕我直言,解决这个问题的正确方法是

    1. familiarize yourself with virtualenv

    2. 创建一个单独的脚本source虚拟环境并启动脚本

    3. 在您的用户 (thisismygodaddyusername) 下将该脚本作为 cron 作业运行。

    一旦您停止从 YouTube 学习编程并开始 reading books,一切都会变得非常简单:)

    【讨论】:

    • 感谢您的回复。所以它在 SSH 而不是 cron 作业中工作的原因是 cronjob 是不同的用户?有什么方法可以构建 cronjob 命令,以便将我的用户(thisismygodaddyusername)作为用户?如何在特定用户下运行 cron 作业?看起来它应该是一件很容易解决的事情,但我会尝试找出 virtualenv 的建议,是的,需要阅读书籍。再次感谢您。
    猜你喜欢
    • 2016-12-07
    • 2016-01-09
    • 2011-12-05
    • 1970-01-01
    • 2012-01-10
    • 2020-03-26
    • 2014-02-02
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多