为什么 sys.path.insert 不使用最新的 python 包?
Why sys.path.insert not using the latest python package?
下面是我的项目结构。
├── folder1
├── test.py
├── folder2
├── A.py
├── folder3
├── A.py
A.py
在 folder2
和 folder3
中除了 self.key
是一样的
#folder2
class TestAPI():
def __init__(self):
self.key = 50
#folder3
class TestAPI():
def __init__(self):
self.key = 100
在test.py
中,代码为
import sys
root_path = '/user/my_account'
sys.path.insert(0, root_path + '/folder2')
from A import TestAPI
test_api = TestAPI()
print(test_api.key)
sys.path.insert(0, root_path + '/folder3')
from A import TestAPI
test_api = TestAPI()
print(test_api.key)
print(sys.path)
在执行 test.py
时,它 returns 50
、50
、['/user/my_account/folder3', '/user/my_account/folder2']
。为什么第二次 from A import TestAPI
不是来自 folder3
而是来自 folder2
?
编辑:如果我想第二次从 folder3
import TestAPI
,有没有办法在 [=27= 之后 'delete' PYTHONPATH
] 来自 folder2
?
sys.path 是一个列表。所以直接用append方法就可以了
此外,您不需要根路径。只是 运行
sys.path.append('folder2')
编辑:证明其有效的演示
[luca@artix Whosebug]$ mkdir my_module
[luca@artix Whosebug]$ ed my_module/foo.py
?my_module/foo.py
i
print('From foo')
.
wq
18
[luca@artix Whosebug]$ python
Python 3.9.1 (default, Feb 6 2021, 13:49:29)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'foo'
>>> import sys
>>> sys.path.append('my_module')
>>> import foo
From foo
>>>
我会将您的 TestAPI
代码 (A.py) 更改为公共文件夹(可以由其他代码导入的文件夹),然后:
class TestAPI():
def __init__(self, key):
self.key = key
然后在您的 test.py 中,您可以执行以下操作:
import sys
root_path = '/user/my_account'
sys.path.insert(0, root_path + '/commons')
from commons.A import TestAPI
test_api_50 = TestAPI(50)
print(test_api_50.key)
test_api_100 = TestAPI(100)
print(test_api_100.key)
如果有 issue/typo,我可以编辑它。
请注意 python folder/packaging 值得一读。未来的你会感谢你。
importlib.reload
解决我的问题
import sys
root_path = '/user/my_account'
sys.path.insert(0, root_path + '/folder2')
import A
test_api = A.TestAPI()
print(test_api.key)
sys.path.insert(0, root_path + '/folder3')
import importlib
importlib.reload(A) # should reload after inserting PYTHONPATH and before import A
import A
test_api = A.TestAPI()
print(test_api.key)
print(sys.path)
下面是我的项目结构。
├── folder1
├── test.py
├── folder2
├── A.py
├── folder3
├── A.py
A.py
在 folder2
和 folder3
中除了 self.key
#folder2
class TestAPI():
def __init__(self):
self.key = 50
#folder3
class TestAPI():
def __init__(self):
self.key = 100
在test.py
中,代码为
import sys
root_path = '/user/my_account'
sys.path.insert(0, root_path + '/folder2')
from A import TestAPI
test_api = TestAPI()
print(test_api.key)
sys.path.insert(0, root_path + '/folder3')
from A import TestAPI
test_api = TestAPI()
print(test_api.key)
print(sys.path)
在执行 test.py
时,它 returns 50
、50
、['/user/my_account/folder3', '/user/my_account/folder2']
。为什么第二次 from A import TestAPI
不是来自 folder3
而是来自 folder2
?
编辑:如果我想第二次从 folder3
import TestAPI
,有没有办法在 [=27= 之后 'delete' PYTHONPATH
] 来自 folder2
?
sys.path 是一个列表。所以直接用append方法就可以了
此外,您不需要根路径。只是 运行
sys.path.append('folder2')
编辑:证明其有效的演示
[luca@artix Whosebug]$ mkdir my_module
[luca@artix Whosebug]$ ed my_module/foo.py
?my_module/foo.py
i
print('From foo')
.
wq
18
[luca@artix Whosebug]$ python
Python 3.9.1 (default, Feb 6 2021, 13:49:29)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'foo'
>>> import sys
>>> sys.path.append('my_module')
>>> import foo
From foo
>>>
我会将您的 TestAPI
代码 (A.py) 更改为公共文件夹(可以由其他代码导入的文件夹),然后:
class TestAPI():
def __init__(self, key):
self.key = key
然后在您的 test.py 中,您可以执行以下操作:
import sys
root_path = '/user/my_account'
sys.path.insert(0, root_path + '/commons')
from commons.A import TestAPI
test_api_50 = TestAPI(50)
print(test_api_50.key)
test_api_100 = TestAPI(100)
print(test_api_100.key)
如果有 issue/typo,我可以编辑它。
请注意 python folder/packaging 值得一读。未来的你会感谢你。
importlib.reload
解决我的问题
import sys
root_path = '/user/my_account'
sys.path.insert(0, root_path + '/folder2')
import A
test_api = A.TestAPI()
print(test_api.key)
sys.path.insert(0, root_path + '/folder3')
import importlib
importlib.reload(A) # should reload after inserting PYTHONPATH and before import A
import A
test_api = A.TestAPI()
print(test_api.key)
print(sys.path)