当项目作为服务启动时,Python 模块导入失败

标签 python service python-import

项目 (Python 3.6) 由一些文件夹组成。在某些文件中有范围扩展,如

sys.path.append('../foo')

由于不是从文件所在的同一目录导入。

它可以在 PyCharm 上运行,并且当应用程序从命令行作为 python.exe app.py 启动时 但是,当项目作为服务启动时,这种导入范围扩展不起作用。使用 pm2 utilite 启动项目并作为服务启动时会检查它。导入的范围扩展不起作用,导入失败。

避免错误的方法是将sys.path.append中的相对路径更改为绝对路径,例如

from pathlib import Path
sys.path.append(str(Path(__file__).parent.parent)+'/foo')

进行此更改后,代码将作为服务启动,不会出现错误。

我怀疑当应用程序作为服务运行时相对路径不起作用。但为什么呢?

最佳答案

sys.pqth.append() 方法只是按原样附加其参数。因此,如果您在 Python 控制台中运行它,您可以看到如下结果:

>>> sys.path.append("../foo")
>>> sys.path
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/yunbo/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages', '../foo']

当您在 PyCharm 中运行代码时,它可能会正常工作。但是,如果您将代码作为服务运行,则 CWD 与您的项目文件夹(或某些子路径)不同。您的代码将查找 CWD/../foo ,但它不会在那里。这就是您的代码无法作为服务运行的原因。

使用sys.pathpathlib是正确的方法。

关于当项目作为服务启动时,Python 模块导入失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59475035/

相关文章:

python-2.7 - 重叠 Python 导入语句 - 不好的做法?

python - 如何将多个模块分组到一个命名空间中?

python - 从列表写入 CSV,write.row 似乎停在了一个奇怪的地方

symfony - 不存在的服务 "request_stack"

python 循环导入再次(也就是这个设计有什么问题)

java - 如何将模块安装为服务 - Android

android - 空 Intent 重新传递给服务 onStartCommand()

python - 使用 os.execl() 重新加载时没有名为 'x' 的模块

python - 在 Python 中使用正则表达式提取文本

python - 如何从Python子列表中提取值