C# 在从c运行的脚本中使用自定义python模块#
我正在尝试从c#控制台应用程序运行python脚本。在我导入我们的定制python模块之前,这段c#代码工作得很好,而定制python模块又反过来导入python脚本中的其他模块,例如arcpy、keyring等。脚本在cmd行中运行良好,但一旦进入c#,它就会挂起。最后会弹出一个系统死锁错误。如何让python运行?目标是将密码从python获取到c#。我对其他方法持开放态度 c# python:不工作——我用“x”替换了自定义python安全调用 python:这很好用C# 在从c运行的脚本中使用自定义python模块#,c#,python-2.7,C#,Python 2.7,我正在尝试从c#控制台应用程序运行python脚本。在我导入我们的定制python模块之前,这段c#代码工作得很好,而定制python模块又反过来导入python脚本中的其他模块,例如arcpy、keyring等。脚本在cmd行中运行良好,但一旦进入c#,它就会挂起。最后会弹出一个系统死锁错误。如何让python运行?目标是将密码从python获取到c#。我对其他方法持开放态度 c# python:不工作——我用“x”替换了自定义python安全调用 python:这很好用 import sys
import sys
database = sys.argv[1]
print database
我还运行下面的测试来检查它是否只是我们的模块,或者问题是否扩展到了其他模块。我用numpy和arcpy进行了测试。两者都失败了
python:不工作
import sys
import numpy
database = sys.argv[1]
print database
问题在于你的脚本,而不是C。您的C#代码格式良好,工作正常(我用一个包含一个参数的hello world脚本替换您的脚本进行了测试,它正确地打印了输出) 如果您说它在命令行上工作,那么注意运行脚本的路径可能很重要。您的脚本可能包含相对路径依赖项。这反过来会影响C代码,因为您可能需要首先从该目录开始 如果你想要我的测试,这里是: script.py:
import sys
database = sys.argv[1]
print("Hello, " + database)
Program.cs:
static void Main(string[] args)
{
var pwd = getPassword("World!");
Console.WriteLine($"OUTPUT: {pwd}");
}
private static string getPassword(string database)
{
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = @"C:\Users\<path-to-my>\python.exe";
string script = @"C:\<path-to-my>\script.py";
start.Arguments = $"\"{script}\" \"{database}\"";
start.UseShellExecute = false;
start.CreateNoWindow = false;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
string errors;
string password;
Console.WriteLine(start.Arguments);
using (Process process = Process.Start(start))
{
errors = process.StandardError.ReadToEnd();
password = process.StandardOutput.ReadToEnd();
}
return password;
}
static void Main(字符串[]args)
{
var pwd=getPassword(“世界!”);
WriteLine($“输出:{pwd}”);
}
私有静态字符串getPassword(字符串数据库)
{
ProcessStartInfo start=新的ProcessStartInfo();
start.FileName=@“C:\Users\\python.exe”;
字符串脚本=@“C:\\script.py”;
start.Arguments=$“\”{script}\“{database}\”;
start.UseShellExecute=false;
start.CreateNoWindow=false;
start.RedirectStandardOutput=true;
start.RedirectStandardError=true;
字符串错误;
字符串密码;
Console.WriteLine(start.Arguments);
使用(Process进程=Process.Start(Start))
{
errors=process.StandardError.ReadToEnd();
密码=process.StandardOutput.ReadToEnd();
}
返回密码;
}
输出:
我在c#中运行了几乎完全相同的测试python脚本。而且效果很好。当我尝试使用不是“开箱即用”python安装的一部分的python模型时,问题就出现了。命令行不仅仅是python自由运行的终端窗口。有一些环境变量是在命令行窗口打开之前设置的。我怀疑您的C#脚本可能缺少其中一个python依赖项。因此,我需要在进程信息中使用类似windows系统环境python home set的内容?我不怀疑这是问题所在。那么,你是否消除了你所处的道路,从而成为问题的根源?这意味着,您的脚本将从命令行中的任何路径运行?感谢您在这方面的帮助。我感谢所有的反馈。我放弃了,用python包装了c#exe。
import sys
database = sys.argv[1]
print("Hello, " + database)
static void Main(string[] args)
{
var pwd = getPassword("World!");
Console.WriteLine($"OUTPUT: {pwd}");
}
private static string getPassword(string database)
{
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = @"C:\Users\<path-to-my>\python.exe";
string script = @"C:\<path-to-my>\script.py";
start.Arguments = $"\"{script}\" \"{database}\"";
start.UseShellExecute = false;
start.CreateNoWindow = false;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
string errors;
string password;
Console.WriteLine(start.Arguments);
using (Process process = Process.Start(start))
{
errors = process.StandardError.ReadToEnd();
password = process.StandardOutput.ReadToEnd();
}
return password;
}