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

通过名称(非值)将变量从IPython终端传递到Python脚本,python,numpy,Python,Numpy,这里是Python新手。我试图将大型numpy数组的元组传递给脚本进行处理,因此需要使用它们的变量名从IPython终端传递它们 我正在寻找的功能可以简化为以下内容: 假设script.py是一个只打印传递给它的变量的脚本 >>> var_name = (1,True) >>> %run script.py var_name (1,True) 这里的var_name是一个由IPython终端知道并创建的变量。到目前为止,在尝试使用sys.argv[1]或ar

这里是Python新手。我试图将大型numpy数组的元组传递给脚本进行处理,因此需要使用它们的变量名从IPython终端传递它们

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

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

>>> var_name = (1,True)
>>> %run script.py var_name
(1,True)
这里的var_name是一个由IPython终端知道并创建的变量。到目前为止,在尝试使用sys.argv[1]或argparse时,我只成功地返回了“var_name”或名称空间(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可以是整数、双精度、字符串、矩阵等

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

谢谢

%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

IPython正在命令行上调用该程序。它以字符串的形式传递
t
,您认为这是一个变量名。因此,脚本得到的唯一参数是
“t”

如果要将变量传递到脚本中,则需要导入脚本,然后调用函数。下面是您的
script.py

def main_function(argument1, argument2):
    # all the stuff you want to do in your script.
def foofn(anarg):
    print(repr(anarg))
if __name__=='__main__':
    import sys
    foofn(sys.argv)
现在,您可以导入脚本并调用该函数:

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

在MATLAB中,每个文件定义一个函数(具有匹配的名称)-至少这是最初的安排。因此
>scriptName(700)
加载文件,并使用您给出的参数调用函数

在Python中,文件包含一个模块,其中可能包含许多函数(以及类定义、变量)和操作。这样的模块可以导入,也可以作为脚本运行。当运行时(从操作系统外壳运行时),如果运行了由
保护的代码
。和
sys.argv
包含命令行参数-作为字符串列表

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

因此,如果您编写了一个脚本文件
foo.py

def main_function(argument1, argument2):
    # all the stuff you want to do in your script.
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
还允许在magic命令中使用
{}

%run foo {t}
但是您的
t
将扩展为一组字符串

'(1,', 'True,', '3.5,', 'hi)'
实际上,
foo.py
负责解析这些字符串(例如使用
argparse

您也可以直接调用
foofn

foofn([1,2,3])
在此函数中,函数将获取数字列表,而不是sys.argv字符串

换句话说,现在可以使用
foo.py
中定义的函数。这接近于在MATLAB中可以执行的操作。您只需首先使用
运行
加载它

如果你这样做了:

import foo
您必须指定
foo
名称空间

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

ipython
do中

%run?
查看其文档;及

%run??
查看文档和代码。发生了很多事情。注意

就这样 将其环境视为作为独立程序运行 (共享全局对象(如以前导入的对象)除外 模块)。但是在执行之后,IPython交互名称空间 使用程序中定义的所有变量进行更新。。。。这允许非常方便地加载 交互式工作,同时给每个程序一个“干净的工作表”来运行



%run
使用一个
'-i'
选项,该选项允许脚本访问在
ipython
会话中定义的变量。因此,如果脚本包含
foo(t)
,并且
t
是在
ipython
中定义的,则将使用该脚本。我从来没有机会使用它。

为什么要在sys.argv[1]上调用tuple?另外,欢迎使用堆栈溢出!我在sy.argv[1]上调用tuple,试图强制输入为存储在t中的tuple。唉,它只是把字符串“t”变成了一个元组。如果大的NumPy数组能够被序列化为JSON,那么作为命令行参数传递将是非常无效的。您可以使用pickle,它将与NumPy阵列一起工作,但它仍然效率低下。最好只导入脚本并调用它。答案很好,比我的更正确。。。出于某种愚蠢的原因,我假设OP知道他想做什么,但我怀疑他真的想要这样做:在我意识到同样的事情之前,PI几乎准备好使用pickle.dumps()提交答案:D