代码之家  ›  专栏  ›  技术社区  ›  AdjunctProfessorFalcon

通过cron作业运行的Python脚本返回IOError[error no2]

  •  1
  • AdjunctProfessorFalcon  · 技术社区  · 9 年前

    我正在Centos6远程服务器(SSHing到服务器)上通过cron作业运行Python提要解析器脚本。

    在Crontab中,这是我的cron工作:

    MAILTO = myemail@company.com
    */10 * * * * /home/local/COMPANY/malvin/SilverChalice_CampusInsiders/SilverChalice_CampusInsiders.py > /home/local/COMPANY/malvin/SilverChalice_CampusInsiders`date +\%Y-\%m-\%d-\%H:\%M:\%S`-cron.log | mailx -s "Feedparser Output" myemail@company.com
    

    然而,我在发送的电子邮件中看到了这条消息,它应该只包含脚本的输出:

    Null message body; hope that's ok
    /usr/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
      InsecurePlatformWarning
    Traceback (most recent call last):
      File "/home/local/COMPANY/malvin/SilverChalice_CampusInsiders/SilverChalice_CampusInsiders.py", line 70, in <module>
        BC_01.createAndIngest(name, vUrl, tags, desc)
      File "/home/local/COMPANY/malvin/SilverChalice_CampusInsiders/BC_01.py", line 69, in createAndIngest
        creds = loadSecret()
      File "/home/local/COMPANY/malvin/SilverChalice_CampusInsiders/BC_01.py", line 17, in loadSecret
        credsFile=open('brightcove_oauth.json')
    IOError: [Errno 2] No such file or directory: 'brightcove_oauth.json'
    

    通常情况下,这是一个无需考虑的问题:我的代码肯定有问题。除了,当我通过 python SilverChalice_CampusInsiders.py

    我在这里做错了什么?为什么Python脚本在通过cron作业运行时不“看到”json oauth文件?

    1 回复  |  直到 9 年前
        1
  •  6
  •   Anand S Kumar    9 年前

    Cron为作业设置了一个最小的环境(我认为它从主目录运行作业)。

    在python脚本中,当您执行以下操作时-

    open('<filename>')
    

    它检查 filename 在当前工作目录中,而不是脚本所在的目录中。

    即使在从命令行运行时也是如此,如果您将目录更改为其他目录(可能是您的主目录),然后使用脚本的绝对路径来运行它,则应该会收到相同的错误。

    您可以尝试以下任一选项,而不是依赖于当前工作目录是否正确并打开您要打开的文件-

    1. 使用要打开的文件的绝对路径,不要使用相对路径。

    2. 或者,如果上面不是您的选项,并且您要打开的文件与正在运行的脚本相关(例如,让我们在同一目录中),那么您可以使用 __file__ (这给出了脚本位置)和 os.path ,以在运行时创建文件的绝对路径,示例-

      import os.path
      
      fdir = os.path.abspath(os.path.dirname(__file__)) #This would give the absolute path to the directory in which your script exists.
      f = os.path.join(fdir,'<yourfile')
      

    最后 f 将具有文件的路径,您可以使用该路径打开文件。