Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在从c运行的脚本中使用自定义python模块#_C#_Python 2.7 - Fatal编程技术网

C# 在从c运行的脚本中使用自定义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

我正在尝试从c#控制台应用程序运行python脚本。在我导入我们的定制python模块之前,这段c#代码工作得很好,而定制python模块又反过来导入python脚本中的其他模块,例如arcpy、keyring等。脚本在cmd行中运行良好,但一旦进入c#,它就会挂起。最后会弹出一个系统死锁错误。如何让python运行?目标是将密码从python获取到c#。我对其他方法持开放态度

c#

python:不工作——我用“x”替换了自定义python安全调用

python:这很好用

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;
        }