从命令提示符处调用时,Python脚本中的Numpy无法导入

时间:2019-06-07 04:54:40

标签: python excel vba numpy

我试图通过在VBA宏中调用脚本来从Excel运行一个简单的Python脚本。每当我从Spyder运行脚本时,它就会完美执行。但是,当我使用VBA从Excel调用脚本时,它将失败。仅当我将Numpy或Pandas(我尚未尝试其他库)导入脚本时,才会发生这种情况。

调用脚本的VBA宏在这里:

Sub RunPythonScript2()

'Declare our variables
Dim RetVal As String
Dim exe As String
Dim python As String
Dim paths As String

exe = "C:\Users\myname\Anaconda3\pythonw.exe"
python = "C:\Users\myname\OneDrive\Reference Documents\Python\Excel and Python\03 Script.py"
paths = """" & exe & """" & " " & """" & python & """"

RetVal = Shell(paths, vbNormalFocus)

End Sub

有效的Python脚本在这里:

import win32com.client

excelapp = win32com.client.Dispatch("Excel.Application")
wb = excelapp.Workbooks(1)
sht = wb.Worksheets(1)

sht.Range('A1').Value = "Hello World "

到目前为止,一切都很好。但是,如果添加了将Numpy或Pandas导入python脚本的语句,那么我将无法再从Excel中成功调用该脚本。但是,我可以从Spyder运行脚本并产生预期的结果。

我最初叫python.exe,但是当我使用时:

import sys
print(sys.executable)

我看到Spyder正在呼叫pythonw.exe。我叫python.exe还是pythonw.exe似乎都没关系。

导入Numpy并运行脚本时,我没有收到任何错误消息。结果是没有任何内容打印到Excel。

我在Windows 10(64位)上使用以下软件包版本

  1. python版本3.7.3
  2. numpy版本1.16.2
  3. pywin32版本223
  4. Anaconda版本自定义(因为我安装了xlwings和geopandas)

我希望能够在Excel中打印如下内容:

sht.Range('A1').Value = np.pi

编辑------------------------------------- 我还确认这与Numpy有关。我可以在Python代码中import sys毫无问题,但是Numpy和Pandas仍然有问题。

其他人已经成功地运行了此代码,因此我怀疑它一定是某种与环境相关的问题。但是,我真的不知道如何管理我的环境。

有关示例,请参见此youtube视频和评论: https://www.youtube.com/watch?v=oVNeufjrx8M&list=PLcFcktZ0wnNnf4eh5ObzPzoLFOzTiFVKa&index=6&t=0s

我尝试全新安装Anaconda,但仍然遇到问题。这是conda info返回的结果:

     active environment : base
    active env location : C:\Users\<user>\AppData\Local\Continuum\anaconda3
            shell level : 1
       user config file : C:\Users\<user>\.condarc
 populated config files : C:\Users\<user>\.condarc
          conda version : 4.6.14
    conda-build version : 3.17.8
         python version : 3.7.3.final.0
       base environment : C:\Users\<user>\AppData\Local\Continuum\anaconda3  (writable)
           channel URLs : https://repo.anaconda.com/pkgs/main/win-64
                          https://repo.anaconda.com/pkgs/main/noarch
                          https://repo.anaconda.com/pkgs/free/win-64
                          https://repo.anaconda.com/pkgs/free/noarch
                          https://repo.anaconda.com/pkgs/r/win-64
                          https://repo.anaconda.com/pkgs/r/noarch
                          https://repo.anaconda.com/pkgs/msys2/win-64
                          https://repo.anaconda.com/pkgs/msys2/noarch
          package cache : C:\Users\<user>\AppData\Local\Continuum\anaconda3\pkgs
                          C:\Users\<user>\.conda\pkgs
                          C:\Users\<user>\AppData\Local\conda\conda\pkgs
       envs directories : C:\Users\<user>\AppData\Local\Continuum\anaconda3\envs
                          C:\Users\<user>\.conda\envs
                          C:\Users\<user>\AppData\Local\conda\conda\envs
               platform : win-64
             user-agent : conda/4.6.14 requests/2.21.0 CPython/3.7.3 Windows/10 Windows/10.0.14393
          administrator : False
             netrc file : None
           offline mode : False

我在家里的计算机上和在工作中的计算机上都发生了同样的问题。

2 个答案:

答案 0 :(得分:0)

好的,让我们逐步了解一下我们需要对您的代码进行的一些更改。我认为问题出在以下事实:当您引用Workbooks集合时,您使用的是index方法,而key方法却是。如果您有个人的Macro Workbook,这可能会给您带来麻烦。

以打开工作簿的顺序确定索引,并且首先<始终>始终打开“个人宏工作簿”。这通常会带来意想不到的后果,因此我告诉人们只使用工作簿的名称。更改以下内容:

旧:

wb = excelapp.Workbooks(1)

新功能:

wb = excelapp.Workbooks("myWorkbook.xlsm")

此外,我认为如果我们删除一些引号,它应该可以正常工作。我重写了每一行,使之用三引号引起来。

旧:

exe = "C:\Users\myname\Anaconda3\pythonw.exe"
python = "C:\Users\myname\OneDrive\Reference Documents\Python\Excel and Python\03 Script.py"
paths = """" & exe & """" & " " & """" & python & """"

新功能:

Set objShell = VBA.CreateObject("Wscript.Shell")    
    exe = """C:\Users\<USER>\Anaconda3\pythonw.exe"""    
    python = """C:\Users\<USER>\OneDrive\myScript.py"""
    objShell.Run exe & python

尝试一下,看看会得到什么。

答案 1 :(得分:0)

事实证明这是一个复杂的问题。我终于想出了直接从Windows命令提示符运行脚本的方法。我收到了此处描述的预期错误:

https://superuser.com/questions/1413313/importerror-missing-required-dependencies-numpy

但是,更改路径变量并没有帮助。我没有尝试创建或更改环境。如果要从Windows命令提示符下检查路径变量,请首先键入 do { // Activities let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 let result = try decoder.decode(Root.self, from: data) self.activities = result.activities DispatchQueue.main.async { self.tableView.reloadData() } } catch { print("Error serializing json: ", error) } ,按Enter,然后键入override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return activities.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ActivityCell", for: indexPath) as! MainTableViewCell let activity = activities[indexPath.row] // assign the activity data to the UI for example // cell.someLabel = activity.amount return cell }

最终有效的解决方案是此解决方案。我不得不将Anaconda版本重置为5.2.0版。

The ordinal 242 could not be located in the dynamic link library Anaconda3\Library\bin\mkl_intel_thread.dll

现在,经过几天的研究,我终于可以从Excel中正确使用Python。向前和向上。