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 关于在包内执行脚本的挑战。
我有一个 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 关于在包内执行脚本的挑战。