Python 将其移至 CentOS 服务器后,程序包损坏

Python package broken after moving it to CentOS server

我有一个 python 应用程序,我最近将它从我开发它的 Windows 盒子移到了 Linux (CentOS) 服务器上。在我编写代码的工作站上 PyCharm 一切正常,但是,在 zipping/tarring 包含文件夹时,无论我将其移动到哪里,我在尝试执行应用程序时都会收到以下错误:

python ..\CONTROLLER\SFTPController.py
    Traceback (most recent call last):
    File "..\CONTROLLER\SFTPController.py", line 3, in <module>
    from SFTP import SFTPGet,SFTPPut
    ImportError: No module named SFTP

如果我将源目录的副本移动到原始开发位置以外的任何地方,就会发生上述情况。

我对此做了一些研究,我当前的工作目录是什么并不重要。结果总是你在上面看到的。我的 Python 经验通常仅限于单个文件的一次性脚本,所以这是我以前没有的经验。

如果有帮助,这是我的申请结构:

顶级目录:Filestuff

Filestuff
|... __init__.py
|... .idea (PyCharm created directory)
|... CONTROLLER|
               |... __init__.py
               |... SFTPController.py
|... SFTP|
         |... __init__.py
         |... SFTPGet.py
         |... SFTPPut.py
|... ZIP|
        |... __init__.py
        |... ZIPWork.py

如您所见,Filestuff 是顶层。它包含 init.py 和其他 3 个包含其 .py 文件以及 init.py 文件的目录。这对我来说看起来像一个标准的 Python 包,如果你将它导入任何系统而不改变结构,它应该可以工作。我敢肯定这是我一定错过的愚蠢简单的事情。非常感谢您帮助解决这个问题!

在导入 SFTP 模块之前使用以下行解决了我的问题:

os.path.append("/path/to/filestuff/")

我觉得这不是最好的方法,所以如果有人知道更好的方法,我将不胜感激,因为这需要根据我部署代码的位置进行更改。 ...

好的,我回答了两次这个问题,但我不喜欢我的回答,但我想到了一些可行的方法。不要附加到 os.path,而是在导入前修改加载路径,并使用相对路径:

import sys
sys.path.append("..")
from SFTP import SFTPGet, SFTPPut

(注意 os.path 改变了系统环境,但是 sys.path 是解释器查找目录以搜索导入的地方)。这样可以避免重新组织文件布局或对路径进行硬编码。

将来,您可能希望将主脚本文件放在包层次结构之外的某个位置。如果放在FileStuff/里面,python不用上面的trick也能找到import

另见 this answer 关于在包内执行脚本的挑战。