我试图从我的VBA模块运行python脚本。我已经尝试过几乎我在互联网上看过的所有例子,因为没有运气。 在VBA模块中,我还运行一个.bat文件,它运行正常:
batchname = "U:\Backup Bat File.bat"
Shell batchname, vbNormalFocus
接下来我需要运行python脚本,它与excel文件位于同一个文件夹中。 现在我正在尝试这个:
Dim Ret_Val
Dim args
args=Activeworkbook.Path & "\beps_output.py"
Ret_Val = Shell("C:\python34\python.exe" & args, vbNormalFocus)
它没有错误,但没有任何反应。我对" Ret_Val"" Ret_Val" (返回值?)在这里,以及它为什么不运行。
答案 0 :(得分:3)
这在我的电脑上运行(Win 7 x64,python 2.7.9):
Sub runpython()
Dim Ret_Val
Dim args As String
args = "W:\programming\python\other_py\sqrt.py"
Ret_Val = Shell("C:\Program Files (x86)\python27\python.exe" & " " & args, vbNormalFocus)
If Ret_Val = 0 Then
MsgBox "Couldn't run python script!", vbOKOnly
End If
End Sub
如果调用成功, Ret_Val
将为非零,即已启动命令的processID。请注意,该命令将异步运行,即VBA代码将继续比外部命令终止更快。
答案 1 :(得分:2)
对我来说困难的部分是诊断代码的哪一部分不起作用。 cmd 窗口闪烁得如此之快,您无法阅读错误消息。只需在 Shell 语句上方添加这行代码即可。
var options = {
roomName: "RoomName",
width: "100%",
height: 1080,
parentNode: document.querySelector("#meet"),
configOverwrite: {
prejoinPageEnabled: false //This here
},
...
...
使用 F8 单步执行代码。
当 cmd 窗口弹出时,输入 (fullpath)python.exe 命令和 (fullpath)script file.py,就像您尝试使用代码一样。 cmd 窗口现在保持打开状态,因此您可以看到消息。
就我而言,这是一张需要完整路径的图片,而不是假设它在同一目录中。
答案 2 :(得分:1)
尝试在exe程序和文件之间添加一个空格:
[TestCase]
public void TestMethod1()
{
AccountController ac = new AccountController();
var mockAuthRepository = new Mock<AuthRepository>();
//mockAuthRepository.Setup(m=>m.RegisterUser(It.IsAny<UserModel>))
}
[RoutePrefix("api/Account")]
public class AccountController : ApiController
{
private readonly AuthRepository _repo;
public AccountController()
{
_repo = new AuthRepository();
}
}
[HttpPost]
[Authorize(Users = "admin")]
[Route("Register")]
public async Task<IHttpActionResult> Register(UserModel userModel)
{
IdentityResult result = await _repo.RegisterUser(userModel);
IHttpActionResult errorResult = WrapError(result);
if (errorResult != null)
{
return errorResult;
}
return Ok();
}
private IHttpActionResult WrapError(IdentityResult result)
{
if (result == null)
{
return InternalServerError();
}
if (!result.Succeeded)
{
if (result.Errors != null)
{
foreach (string err in result.Errors)
{
ModelState.AddModelError("", err);
}
}
if (ModelState.IsValid)
{
return BadRequest();
}
return BadRequest(ModelState);
}
return null;
}
此外,因为Shell是一个返回带有指定参数的值(变量类型 - double)的函数,所以返回的值可以包含在变量中,就像使用Ret_Val指定的那样。然后,您可以使用此值添加条件逻辑和错误处理。