我尝试从R运行Python脚本:
system('python script.py arg1 arg2')
并得到一个错误:
ImportError:没有名为pandas的模块
这是一个令人惊讶的事情,因为脚本正在按照预期从终端工作。之前遇到过这种类型的问题(使用knitr
,以及engine.path
chunk选项),我知道要检查:
Sys.which('python')
# python
# "/usr/bin/python"
并将其与命令行进行比较:
$ which python
# /Users/michael.chirico/anaconda2/bin/python
(即错误的产生是因为我为anaconda发行版安装了pandas
,虽然TBH我不知道为什么我有不同的发行版)
因此我可以通过运行来解决我的问题:
system('/Users/michael.chirico/anaconda2/bin/python script.py arg1 arg2')
我的问题是双重的:
system
/ Sys.which
如何找到与我的终端不同的python
?我读了?Sys.which
的一些提示,但无济于事。特别是,?Sys.which
建议Sys.which
使用which
:
这是系统命令
which
的接口
这显然是(?)不真实的;可以肯定的是,我检查了Sys.which('which')
和which which
以确认两者都指向/usr/bin/which
(由这个花絮刺激):
在类Unix上,安装R时找到(通常是
/usr/bin/which
)的完整路径。
对于后者,我一时兴起尝试Sys.setenv(python = '/Users/michael.chirico/anaconda2/bin/python')
无济于事。
正如一些评论提示的那样,这是一个问题,因为PATH
环境变量对于Finder(或Dock)启动的程序而言不同于终端中的程序。有一些方法可以为Dock启动的应用程序设置PATH
,但它们并不漂亮。这是一个开始寻找你想要走这条路的地方:
https://apple.stackexchange.com/questions/51677/how-to-set-path-for-finder-launched-applications
您可以做的另一件事,可能更简单,就是告诉R在启动时设置PATH
变量,使用Sys.setenv
将路径添加到所需的Python实例。通过将命令放在相应位置的.Rprofile
文件中,您可以只为一个项目,整个用户帐户或整个系统执行此操作。有关如何执行此操作的更多信息:
https://stat.ethz.ch/R-manual/R-devel/library/base/html/Startup.html