将变量通过名称(非值)从IPython终端传递到Python脚本

时间:2015-07-16 00:11:06

标签: python numpy

Python新手在这里。我试图将一个大的numpy数组元组传递给脚本进行处理,所以我需要使用它们的变量名来从IPython终端传递它们。

我正在寻找的能力可简化为以下内容:

假设script.py是一个只打印传递给它的变量的脚本。

>>> var_name = (1,True)
>>> %run script.py var_name
(1,True)

var_name here是一个由IPython终端知道并由其创建的变量。到目前为止,我只是在尝试使用sys.argv [1]或argparse时成功返回“var_name”或Namespace(data =('var_name',))。

最新尝试:

import sys

data = tuple(sys.argv[1])

print data

结果:

>>> t = (1, True, 3.5, "hi")
>>> t
(1, True, 3.5, "hi")
>>> %run script.py t
('t',)

在MATLAB中,导入任务只需在第一行完成:

function[] = scriptName(inputVar)
disp(inputVar)

从MATLAB终端调用脚本看起来像这样:

>> scriptName(700)  
   700

inputVar可以是int,double,string,matrix等。

Python中是否有等效的操作?我必须正确使用sys.argv [1]或argparse吗?我知道这是一个初学者的问题,但在过去2个小时的搜索和阅读中,我找不到任何解决方案。

谢谢!

3 个答案:

答案 0 :(得分:2)

IPython正在命令行上调用该程序。它将t(您认为是变量名称)作为字符串传递。因此,您的脚本获得的唯一参数是"t"

如果要将变量传递到脚本中,您要执行的操作是导入脚本,然后调用该函数。所以这是你的script.py

def main_function(argument1, argument2):
    # all the stuff you want to do in your script.

现在,您只需导入脚本并调用该函数:

>>> import script
>>> script.main_function(variable1, variable2)

答案 1 :(得分:1)

%run script.py json.dumps(var_name.tolist()) #im not sure if run can accept variables

你可以尝试

% import subprocess
% subprocess.check_output('./script.py "%s"'%(json.dumps(var_name.tolist()))

<强> script.py

import sys

data = json.loads(sys.argv[1])

print data

答案 2 :(得分:0)

在MATLAB中,每个文件定义一个函数(具有匹配的名称) - 至少这是原始排列。所以>> scriptName(700)加载文件,并使用你给出的参数调用函数。

在Python中,文件包含一个模块,该模块可能包含许多函数(以及类定义,变量)和操作。这样的模块可以是imported,也可以作为脚本运行。运行时(从OS shell)运行由if __name__=='__main__'保护的代码。 sys.argv包含命令行参数 - 作为字符串列表。

ipython可以导入模块。但它也有这个%run魔法命令。从功能上讲,它就像从shell调用脚本,包括传递sys.argv字符串。 %run的独特之处在于运行的结果放在主ipython工作区中。这有点像from xxx import *命令。

所以如果你写了一个脚本文件foo.py

def foofn(anarg):
    print(repr(anarg))
if __name__=='__main__':
    import sys
    foofn(sys.argv)

然后跑了:

%run foo testing 1 2 3

你会看到argv字符串

['foo.py', 'testing', '1', '2', '3']

ipython还允许在魔术命令中使用{}

%run foo {t}

但您的t会扩展为一组字符串

'(1,', 'True,', '3.5,', 'hi)'

实际上,foo.py负责解析这些字符串(例如argparse)。

您也可以直接致电foofn

foofn([1,2,3])

在这个函数中获取一个数字列表,而不是sys.argv字符串。

换句话说,foo.py中定义的函数现在可以使用了。这与你在MATLAB中可以做的很接近。您只需先使用run加载它。

如果你改为:

import foo

您必须指定foo命名空间。

foo.foofn([1,2,3])

ipython

%run?

查看其文档;和

%run??

查看文档和代码。有很多事情要发生。注意

  

因此   看到它的环境好像它是作为一个独立的程序运行的   (除了共享以前导入的全局对象   模块)。但执行后,IPython交互式命名空间得到了   使用程序中定义的所有变量进行更新....这样可以非常方便地加载代码   交互式工作,同时为每个程序提供一个“干净的工作表”。

%run采用'-i'选项,使脚本可以访问ipython会话中定义的变量。因此,如果脚本包含foo(t),并且t中定义了ipython,则会使用。我从来没有机会使用它。