首页 > 解决方案 > ImportError: No module with Popen subprocess other file in the same folder from terminal/cron

问题描述

当我exec.py直接从终端cronjob 执行(下面的结构)时,执行工作正常。但是,当我想检查脚本是否已经在运行并检查此状态以及从文件中exec.py终止和/或启动时。(注意:它在 PyCharm 中正常工作)我得到:exec.pycron.py

ImportError no module found named layer_a_first.layer_a_second.functions

直接来自终端或 cronjob 的以下命令正常工作:

/home/user/project/venv/bin/python3.6 /home/user/project/layer_a_first/layer_a_second/exec.py

我的项目结构是:

project/
|-- layer_a_first/
|   |-- layer_a_second/
|   |   |-- exec.py
|   |   |-- cron.py
|   |   |-- functions.py
|-- layer_b_first/
|   |-- functions.py

我在哪里调用了一些函数exec.py

import sys
sys.path.append('/home/user/project')

from layer_a_first.layer_a_second.functions import func_a
from layer_b_first.functions import func_b


# Call func_a
func_a()

# Call func_b
func_b()

和中的检查/终止/启动脚本cron.py

import sys
sys.path.append('/home/user/project')

import psutil
from subprocess import Popen

# Check/terminate/launch function
def launch():
    proccron = 'exec.py'
    for process in psutil.process_iter():
        if process.cmdline() == ['python', proccron]:
            print('Process ' + proccron + ' found. Terminating it.')
            process.terminate()
            Popen(['python', proccron])
            print('Process ' + proccron + ' restarting.')
            break
    else:
        print('Process ' + proccron + ' not found: starting it.')
        Popen(['python', proccron])

launch()

当我cron.py在 PyCharm 中启动时,它工作正常。但是当我使用终端或 cronjob 命令时,我得到了上面提到的ImportError

/home/user/project/venv/bin/python3.6 /home/user/project/layer_a_first/layer_a_second/cron.py

我已经尝试了很多更改sys.path目录或使用os.chdir跳转到正确的目录。这一切都行不通。有谁知道我该如何解决这个问题?最好它仍然在终端和 PyCharm 中工作,但终端命令具有优先级。

非常感谢您花时间帮助我!

标签: pythonpython-3.xpathpython-importsys

解决方案


推荐阅读