使用sys.path.append导入python模块

时间:2018-02-20 12:35:46

标签: python python-2.7

我有两个python模块,我试图import使用sys.path.appendsys.path.insert。以下是我的代码

import sys
sys.path.insert(1, "/home/sam/pythonModules/module1")
sys.path.append("/home/sam/pythonModules/module2")

from lib.module1 import A
from lib.module2 import B

我有以下文件夹结构

/home/sam/pythonModules/module1/lib/module1.py
/home/sam/pythonModules/module2/lib/module2.py

我能够导入lib.module1但不能导入lib.module2。如果我这样做

import sys
sys.path.insert(1, "/home/sam/pythonModules/module2")
sys.path.append("/home/sam/pythonModules/module1")

from lib.module1 import A
from lib.module2 import B

然后我可以import module2但不能module1

上述导入错误的原因是什么?

我按照以下方式尝试append而不是insert,但它仍然不起作用

import sys
sys.path.append("/home/sam/pythonModules/module1")
sys.path.append("/home/sam/pythonModules/module2")

from lib.module1 import A
from lib.module2 import B

始终只有sys.path.append中的第一个模块已成功导入。

但是我按照以下方式对sys.path.append中的路径进行了一些更改,然后才能正常工作。两个模块都已成功导入

 import sys
 sys.path.append("/home/sam/pythonModules/module1")
 sys.path.append("/home/sam/pythonModules/module2/lib")

 from lib.module1 import A
 from module2 import B

3 个答案:

答案 0 :(得分:1)

我担心你不能这样做。

由于结构:

/home/sam/pythonModules/module1/lib/module1.py
/home/sam/pythonModules/module2/lib/module2.py

你不能同时放两个:

  • /home/sam/pythonModules/module1
  • /home/sam/pythonModules/module2
<{1>}中的

并期望Python找到:

    sys.path和中
  • module1module1/lib
  • module2

当您尝试导入时:

module2/lib

如果您将from lib.module1 import A from lib.module2 import B 放在/home/sam/pythonModules/module1数组中/home/sam/pythonModules/module2之前,则sys.path会在import lib.MODULE中搜索MODULE

由于其中只有/home/sam/pythonModules/module1/lib且没有module1,因此您会收到错误。

你能做的就是把两者都放在

  • module2
  • /home/sam/pythonModules/module1/lib/
/home/sam/pythonModules/module2/lib/

并期望Python使用下一行正确导入它们:

sys.path

答案 1 :(得分:0)

无法使用sys.path.insert,只有当您想在PYTHONPATH中将项目优先于其他项目时才能使用。{/ p>

import sys

sys.path.append("/home/sam/pythonModules/module1")
sys.path.append("/home/sam/pythonModules/module2")

from lib.module1 import A 
from lib.module2 import B 

您的项目module1 / module2也应该构建为有效的包,请参阅官方指南:http://docs.python-guide.org/en/latest/writing/structure/

答案 2 :(得分:0)

我不确定您为何选择使用sys.insert

sys.path.insert(1, "/home/sam/pythonModules/module1")

这将覆盖搜索列表中的第二个元素。我认为这是我的情况下的当前文件夹(在pyCharm中)。你想要这个吗?

sys.path.append("/home/sam/pythonModules/module2")

添加到当前搜索列表,以便它不会覆盖任何内容。但它将是最后搜索的地方(在搜索所有以前的搜索之后)。如果您有任何具有相同名称的文件(无论如何都不是一个好主意),它将首先执行。

from lib.module1 import A

您是从lib文件夹导入但该文件夹在哪里?从你的结构来看,它不会出现。

您应该只能使用以下内容导入两者:

from module1 import A
from module2 import B