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

问题描述 投票:1回答:2

一个项目(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')

此更改之后,代码将作为服务正常启动,没有错误。

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

python service python-import
2个回答
0
投票

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是正确的方法。


0
投票

[当您使用pm2作为服务启动项目时,您的python解释器当前位于哪个工作目录中? os.getcwd()。它可能不在您的项目根目录中。

根据https://pm2.keymetrics.io/docs/usage/application-declaration/#general可以将pm2配置为设置cwd-因此需要将其设置为项目根目录。

© www.soinside.com 2019 - 2024. All rights reserved.