如何在完整路径下加载Python模块?请注意,该文件可以位于文件系统中的任何位置,因为它是一个配置选项.
在python我有很多功能,如下面的那些.我想运行名称匹配的所有函数,setup_*而不必从main显式调用它们.运行函数的顺序并不重要.我怎么能在python中这样做?
def setup_1():
....
def setup_2():
....
def setup_3():
...
...
if __name__ == '__main__':
setup_*()
Run Code Online (Sandbox Code Playgroud) 我有两个文件说a.py和b.py.
在a.py中,我们这样做
import xxx
from b import *
Run Code Online (Sandbox Code Playgroud)
在b.py中我们有一个需要的功能module xxx.现在,当b.py从中调用函数时a.py,无法找到该模块xxx.
为什么这可以解决这个问题?我不能做import xxx在b.py出于某种原因.
MCV:
a.py
import xxx
from b import *
fun()
Run Code Online (Sandbox Code Playgroud)
b.py
def fun():
xxx.dosomething()
Run Code Online (Sandbox Code Playgroud)
错误:
Global name xxx not defined
在C中,看到一个需要大量输入的函数并不罕见,其中许多/大多数都是可选组,这些在结构中使得开发人员的界面更加清晰.(即使你应该能够依赖编译器接受一个函数至少127个参数,但是没有人真正想写那么多,特别是当C没有重载或默认函数参数支持时).作为一个假设的例子,我们可以考虑以下结构/函数对(test.h)来说明问题:
#include <stdbool.h>
typedef struct {
const char *name;
void *stuff;
int max_size;
char flags;
_Bool swizzle;
double frobination;
//...
} ComplexArgs;
void ComplexFun(const ComplexArgs *arg) {}
Run Code Online (Sandbox Code Playgroud)
当使用SWIG进行包装时,我们可以使用以下方法快速完成工作:
%module test
%{
#include "test.h"
%}
typedef bool _Bool;
%include "test.h"
Run Code Online (Sandbox Code Playgroud)
这有效,我们可以使用如下:
import test
args=test.ComplexArgs()
args.flags=100;
args.swizzle=True
test.ComplexFun(args)
Run Code Online (Sandbox Code Playgroud)
但这并不完全是Pythonic.Python开发人员会更习惯于看到用于支持这种调用的kwargs:
import test
# Not legal in the interface currently:
test.ComplexFun(flags=100, swizzle=True)
Run Code Online (Sandbox Code Playgroud)
我们怎样才能做到这一点?SWIG -keyword命令行选项也没有帮助,因为该函数只有一个实际参数.
而不是定义
from numpy import cos as cos
from numpy import arccos as arccos
Run Code Online (Sandbox Code Playgroud)
等等,我能做点什么吗?
trigfunctions = ('cos','arccos','sin','arcsin','tan','arctan')
for method in trigfunctions:
setattr(HERE,method,getattr(numpy,method))
Run Code Online (Sandbox Code Playgroud)
其中HERE要么是全球空间(或可能,局部功能的环境)?这将使得更容易定义基于cos,arccos而无需指定命名空间,并从所需模块加载适当的函数(例如,math如果numpy不可用).我意识到这可能会在非常普遍地应用时导致错误,但在某些小的情况下它会很有用.