Python是非常优雅的语言.好吧,除了......除了进口.我仍然无法以对我来说似乎很自然的方式工作.
我有一个MyObjectA存档的类mypackage/myobjecta.py.该对象使用了一些实用程序函数mypackage/utils.py.所以在我myobjecta.py写的第一行:
from mypackage.utils import util_func1, util_func2
但是一些实用程序函数创建并返回新的实例MyObjectA.所以我需要写utils.py:
from mypackage.myobjecta import MyObjectA
好吧,不,我不能.这是一个循环导入,Python将拒绝这样做.
关于这个问题,这里有很多问题,但似乎都没有给出令人满意的答案.从我在所有答案中可以阅读的内容:
import ...而不是from ... import ...
(我个人不喜欢编写并可能重构所有全名限定符;我喜欢看看我从外部世界导入到模块中的确切内容).那会有帮助吗?我不确定,还有循环进口.我仍然希望有解决方案4)这将是Pythonic在功能和优雅,简单和工作的意义上.或者没有?
注意:我主要是一个C++程序员,上面的例子通过包含相应的标题很容易解决,我不相信它在Python中是不可能的.
我正在尝试使用 ctypes 并两次加载相同的编译 Fortran 库,这样我就有两个独立的实例,这样库包含的任何模块变量都不会存储在相同的内存位置。描述的一般解决方案(例如,此处:https : //mail.python.org/pipermail/python-list/2010-May/575368.html)是提供库的完整路径,而不仅仅是其名称。但是,我无法让它像这样工作。这是一个演示问题的最小工作示例:
测试.f90:
module test
    use iso_c_binding, only: c_int
    implicit none
    integer :: n
contains
    integer(c_int) function get() bind(c, name='get')
        get = n
    end function get
    subroutine set(new_n) bind(c, name='set')
        integer(c_int), intent(in) :: new_n
        n = new_n
    end subroutine set
end module test
测试.py:
import os
from ctypes import cdll, c_int, byref
if __name__ == '__main__':
    lib1 = cdll.LoadLibrary(os.path.abspath('test.so'))
    lib2 = cdll.LoadLibrary(os.path.abspath('test.so'))
    lib1.set(byref(c_int(0)))
    lib2.set(byref(c_int(1)))
    print(lib1.get())
Fortran 库是使用以下命令编译的:
gfortran -shared -fPIC -o test.so test.f90 …