在Visual Basic 2015和Python之间传递变量

问题描述 投票:1回答:1

我正在研究调用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浮点数,则数组更容易作为指针传递。

python vb.net visual-studio-2015
1个回答
0
投票

您的VB代码只是将1作为命令行参数传递,这很好 - 尽管您可能需要更改它以在脚本名称后添加空格。

所以,在你的Python代码中,sys.argv[1]将是字符串"1",因为这是数字1的字符串表示。

您可以使用intfloat将其转换回数字(取决于它是否始终为整数,或者可能类似于1.5)。

出于某种原因,你已经将argv复制到另一个名为script的变量中,然后再复制到另一个名为msg的变量中,然后忽略它,用字符串msg替换"Hello Wolrd",并将常量1分配给arg1。而不是所有这些,这样做:

from sys import argv
arg1 = float(argv[1])

而已。

但…

我最终想要传递一个指向Python的指针,因为我将传递一个数组,并且我认为如果它是大约100x100浮点数,则数组更容易作为指针传递。

你不能这样做。命令行参数只能是一些简短的字符串,而不是巨大的东西,而不是你不能轻易地转换为字符串的东西,绝对不是指向你自己的内存的指针。

在这种情况下,您通常要做的是:

  1. 让VB以一种漂亮的格式(如CSV或JSON)将数组导出为文件,将文件名作为命令行参数传递,并让Python从文件中导入数组。
  2. 让VB以一种不错的格式将数组转换为字符串,并将其作为标准输入传递给Python,并让Python从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)
© www.soinside.com 2019 - 2024. All rights reserved.