我有两个python模块,我试图import
使用sys.path.append
和sys.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
答案 0 :(得分:1)
我担心你不能这样做。
由于结构:
/home/sam/pythonModules/module1/lib/module1.py
/home/sam/pythonModules/module2/lib/module2.py
你不能同时放两个:
/home/sam/pythonModules/module1
和/home/sam/pythonModules/module2
并期望Python找到:
sys.path
和中module1
在module1/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