使用 rpy2 从包中的多个模块访问单个 R 实例
Access a single R instance from multiple modules in package using rpy2
如何确保只有一个 R 实例 运行 并且可以使用 rpy2 从包中的模块访问?
例如,假设包 foobar
的顶层具有模块 foo.py 和 bar.py,以及带有测试模块 test_[=29= 的子包“tests” ]:
.
├── tests
│ ├── __init__.py
│ ├── test_foo.py
├── foo.py
├── bar.py
├── __init__.py
可以在一个地方导入 rpy2,比如说,顶层 init.py,然后让所有其他模块导入 robjs
。比如顶层init.py可以是:
from rpy2.robjects.packages import importr
import rpy2.robjects as robjs
import rpy2.robjects.conversion as cv
from import rpy2.robjects import pandas2ri
然后在其他模块中:
import foobar
# Do stuff with foobar.robjs, foobar.cv, foobar.pandas2ri
或者是否有更好的安排让模块共享同一个 R 实例?
Packages/modules 是 Python 中的单例(在同一程序中的所有导入中,每个模块只有一个“副本”)。
您可以 import rpy2.robjects as robjs
任意多次并跨任意多个模块,它将在一个进程中使用完全相同的 R“实例”。
要验证这一点,您可以将以下代码片段添加到您为程序编写的所有模块中:
import rpy2.robjects as ro
rvar_name = 'import_%s' % __name__
ro.globalenv[rvar_name] = True
print('---')
print(__name__)
print(tuple(ro.globalenv.keys()))
print('---')
如何确保只有一个 R 实例 运行 并且可以使用 rpy2 从包中的模块访问?
例如,假设包 foobar
的顶层具有模块 foo.py 和 bar.py,以及带有测试模块 test_[=29= 的子包“tests” ]:
.
├── tests
│ ├── __init__.py
│ ├── test_foo.py
├── foo.py
├── bar.py
├── __init__.py
可以在一个地方导入 rpy2,比如说,顶层 init.py,然后让所有其他模块导入 robjs
。比如顶层init.py可以是:
from rpy2.robjects.packages import importr
import rpy2.robjects as robjs
import rpy2.robjects.conversion as cv
from import rpy2.robjects import pandas2ri
然后在其他模块中:
import foobar
# Do stuff with foobar.robjs, foobar.cv, foobar.pandas2ri
或者是否有更好的安排让模块共享同一个 R 实例?
Packages/modules 是 Python 中的单例(在同一程序中的所有导入中,每个模块只有一个“副本”)。
您可以 import rpy2.robjects as robjs
任意多次并跨任意多个模块,它将在一个进程中使用完全相同的 R“实例”。
要验证这一点,您可以将以下代码片段添加到您为程序编写的所有模块中:
import rpy2.robjects as ro
rvar_name = 'import_%s' % __name__
ro.globalenv[rvar_name] = True
print('---')
print(__name__)
print(tuple(ro.globalenv.keys()))
print('---')