python库和模块的区别_Python动态库模块的名称与文件名不同
在Python中,模塊的名稱通常與相應文件的名稱相同,但是我遇到了與模塊無關的問題,事實并非如此:
1
2
3
4
5
6me@host:/usr/lib/python2.7/dist-packages/paraview$ ls vtkCommonCorePython*
vtkCommonCorePython.x86_64-linux-gnu.so
me@host:/usr/lib/python2.7/dist-packages/paraview$ python -c \
"import vtkCommonCorePython; print(vtkCommonCorePython.__file__)"
vtkCommonCorePython.x86_64-linux-gnu.so
它是如何工作的?
我的問題是我嘗試將此模塊與另一個Python(/opt/python/2.7.9/bin/python)一起使用,但找不到該模塊:
1
2
3
4
5
6
7
8me@host:/usr/lib/python2.7/dist-packages/paraview$ module load python/2.7.9
--- Loading module environment: python/2.7.9
------------------------------------------------
me@host:/usr/lib/python2.7/dist-packages/paraview$ python -c \
"import vtkCommonCorePython; print(vtkCommonCorePython.__file__)"
Traceback (most recent call last):
File"", line 1, in
ImportError: No module named vtkCommonCorePython
注意:/usr/lib/python2.7/lib-dynload中的大多數文件也以x86_64-linux-gnu.so結尾,而/opt/python/2.7.9/lib/python2.7/lib-dynload中的文件僅以.so結尾。
更新后cdarke的答案:
cdarke提到了imp.get_suffixes函數,該函數返回帶有后綴及其對Python含義的元組:
與/opt/python/2.7.9/bin/python
1[('.so', 'rb', 3), ('module.so', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]
和/ usr / lib / python
1[('.x86_64-linux-gnu.so', 'rb', 3), ('.so', 'rb', 3), ('module.so', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]
這種差異解釋了為什么我得到此錯誤,但是似乎這些后綴沒有在site.py中設置(如cdarke所寫),并且沒有函數imp.set_suffixes。
因此,要解決該問題,我需要知道如何設置這些后綴。
更新2
因此,似乎后綴已編碼為二進制Python文件,這意味著在構建Python之后就無法對其進行修改。因此,解決該問題的最干凈方法是重建opt Python,從而了解為configure提供哪些選項以獲取Debian Jessie下的Python多體系結構作為Python系統。
Cdarke,非常感謝您的幫助。
請參閱:stackoverflow.com/questions/13495285/
.so文件當然也可以用C或C ++編寫。在Python 2 API中,有一個入口點函數在其中命名模塊,因此對于名為" example"的模塊:
1
2
3
4PyMODINIT_FUNC initexample(void)
{
(void)Py_InitModule("example", ExampleMethods);
}
Py_InitModule的第二個參數是方法數組的名稱-基本上是C函數名稱的列表。 .so文件與Python27運行時庫鏈接。
那么Python如何知道要使用哪些后綴?您可以使用以下方法找到這些:
1
2import imp
print imp.get_suffixes()
這將顯示系統上模塊的有效后綴(imp模塊的文檔具有指導意義)。
編輯:
在深入研究了源代碼等之后,我發現了configure.ac中的相關行。在構建期間使用了兩個宏,VERSION和SOVERSION。在我看來,差異是因為python是用不同的方式構建的。我認為答案是在每個平臺上從源代碼構建模塊。
我提供的有關site.py的原始信息來自http://bioportal.weizmann.ac.il/course/python/PyMOTW/PyMOTW/docs/site/index.html,但我尚未對其進行測試。
有一個未公開的imputil.add_suffix()函數,但是顯然不是設計用來由用戶調用的。
感謝您的imp.get_suffixes()。 但是,似乎這些后綴未在site.py中設置...
@paugier:是的,您是對的,我的信息已經過時了。 我會追逐
總結
以上是生活随笔為你收集整理的python库和模块的区别_Python动态库模块的名称与文件名不同的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中while语句的用法_py
- 下一篇: 用python绘制好看的图形_如何使用P