我正在研究调用Python 2.7程序的Visual Basic 2015中的代码。现在我试图将一个变量“arg1 = 1”从VB传递给Python。这是VB代码:
Private Sub FWHM_Click(sender As Object, e As EventArgs) Handles FWHM.Click
Dim pythonProcess As New Process()
Dim arg1 As New Integer
arg1 = 1
With pythonProcess
.StartInfo.FileName = "pythonw.exe"
.StartInfo.WorkingDirectory = "C:\Users\...\"
.StartInfo.Arguments = ("HelloWorld.py" & arg1)
.StartInfo.RedirectStandardOutput = True
.StartInfo.UseShellExecute = False
.StartInfo.CreateNoWindow = True
.Start()
End With
End Sub
正如您所看到的,当我单击表单中的按钮时,代码会激活。当我不尝试传递“arg1”时,按钮工作正常,因为python代码显示了一个带有正弦图的窗口。 arg1的值将改变正弦曲线图的周期。
这是Python代码,非常简单。我刚开始学习使用Python。我不是在学习Python,只是为了学习它。我只需要Python来执行一些最终将在VB程序中使用的数学库:
from sys import argv
script = argv
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
msg= script
msg= "Hello Wolrd"
print(msg)
arg1= 1
x = np.linspace(0, 20, 100)
plt.plot(x, np.sin(x*arg1))
plt.show()
我最终想要传递一个指向Python的指针,因为我将传递一个数组,并且我认为如果它是大约100x100浮点数,则数组更容易作为指针传递。
您的VB代码只是将1
作为命令行参数传递,这很好 - 尽管您可能需要更改它以在脚本名称后添加空格。
所以,在你的Python代码中,sys.argv[1]
将是字符串"1"
,因为这是数字1
的字符串表示。
您可以使用int
或float
将其转换回数字(取决于它是否始终为整数,或者可能类似于1.5
)。
出于某种原因,你已经将argv
复制到另一个名为script
的变量中,然后再复制到另一个名为msg
的变量中,然后忽略它,用字符串msg
替换"Hello Wolrd"
,并将常量1
分配给arg1
。而不是所有这些,这样做:
from sys import argv
arg1 = float(argv[1])
而已。
但…
我最终想要传递一个指向Python的指针,因为我将传递一个数组,并且我认为如果它是大约100x100浮点数,则数组更容易作为指针传递。
你不能这样做。命令行参数只能是一些简短的字符串,而不是巨大的东西,而不是你不能轻易地转换为字符串的东西,绝对不是指向你自己的内存的指针。
在这种情况下,您通常要做的是:
sys.stdin
解析它。第一个可能更简单一些(因为您不必学习如何写入子进程的stdin管道)。我不知道如何编写VB方面,但Python方面看起来像这样:
import json
import sys
with open(sys.argv[1], 'rb') as f:
arr = json.load(f)
然后,如果你想将它从列表列表转换为numpy 2D数组,那么你可以将其与任何其他值相同:
arr = np.array(arr)