我正在努力解决嵌套__init__.py在我正在编写的Python包中的问题。该包具有以下架构:
module/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 submodule1\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 source.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 submodule2\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 source.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 subsubmodule2\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 source.py\nRun Code Online (Sandbox Code Playgroud)\n我的目的是能够访问submodule2/source.pythroughmodule.submodule2.function和 in subsubmodules2/source.pythrough中定义的函数module.submodule2.subsubmodule2.function。
我尝试的第一件事就是__init__.py这样定义submodule2:
from .subsubmodule2 import *\nRun Code Online (Sandbox Code Playgroud)\nsubsubmodules2/source.py但这样做,我得到了through module.submodule2.function(and )中定义的函数module.function。
如果我做:
\nfrom . import subsubmodule2\nRun Code Online (Sandbox Code Playgroud)\n我通过module.subsubmodule2.function.
我还尝试__all__在 中定义关键字__init__,但没有成功。如果我很好地理解Python 文档,我想我可以保留空__init__.py文件并且它可以工作,但根据我的理解,这也不是最佳实践。
按照我的模块的预期访问这些功能的最佳方式是什么?
\n我开始使用MPI-IO并试图写一个我想用它做的事情的一个非常简单的例子; 然而,即使它是一个简单的代码,我从这里和那里读到的例子中获得了一些灵感,我得到了一个我不明白的分段错误.
这段代码的逻辑非常简单:每个线程都将处理一个本地数组,该数组是我想写的全局数组的一部分.我使用MPI_Type_Create_Subarray这样做创建一个子阵列类型.然后我只是打开文件,设置视图并尝试写入数据.我在这期间得到了分段错误MPI_File_Write_All.
这是代码:
program test
implicit none
include "mpif.h"
integer :: myrank, nproc, fhandle, ierr
integer :: xpos, ypos
integer, parameter :: loc_x=10, loc_y=10
integer :: loc_dim
integer :: nx=2, ny=2
real(8), dimension(loc_x, loc_y) :: data
integer :: written_arr
integer, dimension(2) :: wa_size, wa_subsize, wa_start
call MPI_Init(ierr)
call MPI_Comm_Rank(MPI_COMM_WORLD, myrank, ierr)
call MPI_Comm_Size(MPI_COMM_WORLD, nproc, ierr)
xpos = mod(myrank, nx)
ypos = mod(myrank/nx, ny)
data = myrank
loc_dim = loc_x*loc_y
wa_size = (/ nx*loc_x, ny*loc_y /) …Run Code Online (Sandbox Code Playgroud) 我想转换我以其他格式传递给argparse的参数; 我们的想法是传递一个数字(通常是一个浮点数)并将其转换为字符串(通常为浮点数的Fortran表示法).
首先,我尝试创建自定义类型
def FortranFloat(value):
vfloat = float(value)
vfloat = str(vfloat) + "d0"
return vfloat
parser = argparse.ArgumentParser()
parser.add_argument("--xmin=", dest="xmin", type=FortranFloat, default=-2.0)
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
它运作良好......如果我真的给出了--xmin=论点.否则,它只是保留-2.0,而不是-2.0d0按照我的意愿转换它.因此我认为可以更容易地给出我想要的格式的默认值,所以替换2.0为'2.0d0'...有趣的是它被评估,因为它崩溃并引发以下错误
argparse.ArgumentError: argument --xmin=: invalid FortranFloat value: '-2.0d0'
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我尝试创建自定义操作
class FortranConverter(argparse.Action):
def __call__(self, parser, namespace, values, option_strings=None):
if type(values) is float:
values = str(values) + "d0"
setattr(args, self.dest, values)
parser = argparse.ArgumentParser()
parser.add_argument("--xmin=", dest="xmin", type=float, default=-2.0, action=FortranConverter)
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
那也行不通.它似乎甚至没有经历我的行动(如果我在其中打印一些东西__call__,它将忽略它).
任何想法,想法或解释将不胜感激!
我遇到了OpenMP和共享变量的问题我无法理解.我所做的一切都在Fortran 90/95中.
这是我的问题:我的main程序中定义了一个并行区域,带有子句DEFAULT(SHARED),我在其中调用了一个执行某些计算的子程序.我有一个我分配的局部变量(数组),我在其上进行计算.我期待这个数组被共享(因为该DEFAULT(SHARED)子句),但似乎并非如此.
这是我正在尝试做的一个例子,它重现了我得到的错误:
program main
!$ use OMP_LIB
implicit none
integer, parameter :: nx=10, ny=10
real(8), dimension(:,:), allocatable :: array
!$OMP PARALLEL DEFAULT(SHARED)
!$OMP SINGLE
allocate(array(nx,ny))
!$OMP END SINGLE
!$OMP WORKSHARE
array = 1.
!$OMP END WORKSHARE
call compute(array,nx,ny)
!$OMP SINGLE
deallocate(array)
!$OMP END SINGLE
!$OMP END PARALLEL
contains
!=============================================================================
! SUBROUTINES
!=============================================================================
subroutine compute(array, nx, ny)
!$ use OMP_LIB
implicit none
real(8), dimension(nx,ny) :: array
integer :: nx, ny
real(8), dimension(:,:), allocatable …Run Code Online (Sandbox Code Playgroud)