相关疑难解决方法(0)

循环进口地狱

Python是非常优雅的语言.好吧,除了......除了进口.我仍然无法以对我来说似乎很自然的方式工作.

我有一个MyObjectA存档的类mypackage/myobjecta.py.该对象使用了一些实用程序函数mypackage/utils.py.所以在我myobjecta.py写的第一行:

from mypackage.utils import util_func1, util_func2
Run Code Online (Sandbox Code Playgroud)

但是一些实用程序函数创建并返回新的实例MyObjectA.所以我需要写utils.py:

from mypackage.myobjecta import MyObjectA
Run Code Online (Sandbox Code Playgroud)

好吧,不,我不能.这是一个循环导入,Python将拒绝这样做.

关于这个问题,这里有很多问题,但似乎都没有给出令人满意的答案.从我在所有答案中可以阅读的内容:

  1. 重新组织你的模块,你做错了!但即使在我提出的这么简单的情况下,我也不知道如何更好地组织我的模块.
  2. 尝试import ...而不是from ... import ... (我个人不喜欢编写并可能重构所有全名限定符;我喜欢看看我从外部世界导入到模块中的确切内容).那会有帮助吗?我不确定,还有循环进口.
  3. 在你使用其他模块的东西之前,做一些黑客就像在函数体的内部范围中导入一些东西.

我仍然希望有解决方案4)这将是Pythonic在功能和优雅,简单和工作的意义上.或者没有?

注意:我主要是一个C++程序员,上面的例子通过包含相应的标题很容易解决,我不相信它在Python中是不可能的.

python import circular-dependency

13
推荐指数
1
解决办法
955
查看次数

具有 Ctypes 的独立 CDLL 库实例

我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

测试.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())
Run Code Online (Sandbox Code Playgroud)

Fortran 库是使用以下命令编译的:

gfortran -shared -fPIC -o test.so test.f90 …
Run Code Online (Sandbox Code Playgroud)

python fortran ctypes

5
推荐指数
1
解决办法
697
查看次数

标签 统计

python ×2

circular-dependency ×1

ctypes ×1

fortran ×1

import ×1