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个小时的搜索和阅读中,我找不到任何解决方案。
谢谢!
答案 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
,则会使用。我从来没有机会使用它。