diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..e9150297 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +################################################################################ +# This .gitignore file was automatically created by Microsoft(R) Visual Studio. +################################################################################ + +/.vs diff --git a/Activities/Python/3rdparty/Python.Runtime.27.dll b/Activities/Python/3rdparty/Python.Runtime.27.dll index 6a1a6873..0355cda7 100644 Binary files a/Activities/Python/3rdparty/Python.Runtime.27.dll and b/Activities/Python/3rdparty/Python.Runtime.27.dll differ diff --git a/Activities/Python/3rdparty/Python.Runtime.35.dll b/Activities/Python/3rdparty/Python.Runtime.35.dll index df5d1b68..e3655b05 100644 Binary files a/Activities/Python/3rdparty/Python.Runtime.35.dll and b/Activities/Python/3rdparty/Python.Runtime.35.dll differ diff --git a/Activities/Python/3rdparty/Python.Runtime.36.dll b/Activities/Python/3rdparty/Python.Runtime.36.dll index 5b229bcb..9eece01f 100644 Binary files a/Activities/Python/3rdparty/Python.Runtime.36.dll and b/Activities/Python/3rdparty/Python.Runtime.36.dll differ diff --git a/Activities/Python/3rdparty/Python.Runtime.37.dll b/Activities/Python/3rdparty/Python.Runtime.37.dll new file mode 100644 index 00000000..8ea030ea Binary files /dev/null and b/Activities/Python/3rdparty/Python.Runtime.37.dll differ diff --git a/Activities/Python/3rdparty/Python.Runtime.38.dll b/Activities/Python/3rdparty/Python.Runtime.38.dll new file mode 100644 index 00000000..e76ca14a Binary files /dev/null and b/Activities/Python/3rdparty/Python.Runtime.38.dll differ diff --git a/Activities/Python/3rdparty/x64/Python.Runtime.27.dll b/Activities/Python/3rdparty/x64/Python.Runtime.27.dll new file mode 100644 index 00000000..a3d74ea6 Binary files /dev/null and b/Activities/Python/3rdparty/x64/Python.Runtime.27.dll differ diff --git a/Activities/Python/3rdparty/x64/Python.Runtime.35.dll b/Activities/Python/3rdparty/x64/Python.Runtime.35.dll index 7206c9b3..23fe6f51 100644 Binary files a/Activities/Python/3rdparty/x64/Python.Runtime.35.dll and b/Activities/Python/3rdparty/x64/Python.Runtime.35.dll differ diff --git a/Activities/Python/3rdparty/x64/Python.Runtime.36.dll b/Activities/Python/3rdparty/x64/Python.Runtime.36.dll index 63193b8e..525ad7e5 100644 Binary files a/Activities/Python/3rdparty/x64/Python.Runtime.36.dll and b/Activities/Python/3rdparty/x64/Python.Runtime.36.dll differ diff --git a/Activities/Python/3rdparty/x64/Python.Runtime.37.dll b/Activities/Python/3rdparty/x64/Python.Runtime.37.dll new file mode 100644 index 00000000..26a43ecf Binary files /dev/null and b/Activities/Python/3rdparty/x64/Python.Runtime.37.dll differ diff --git a/Activities/Python/3rdparty/x64/Python.Runtime.38.dll b/Activities/Python/3rdparty/x64/Python.Runtime.38.dll new file mode 100644 index 00000000..b3ed3e05 Binary files /dev/null and b/Activities/Python/3rdparty/x64/Python.Runtime.38.dll differ diff --git a/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.Designer.cs b/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.Designer.cs index 45f509a5..4c16fb5a 100644 --- a/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.Designer.cs +++ b/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.Designer.cs @@ -19,7 +19,7 @@ namespace UiPath.Python.Activities.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class UiPath_Python_Activities { @@ -168,6 +168,15 @@ internal static string InvalidPathException { } } + /// + /// Looks up a localized string similar to Selected version {0} is different from the version found {1}. + /// + internal static string InvalidVersionException { + get { + return ResourceManager.GetString("InvalidVersionException", resourceCulture); + } + } + /// /// Looks up a localized string similar to Error invoking Python method. /// @@ -403,7 +412,7 @@ internal static string RunScriptNameDisplayName { } /// - /// Looks up a localized string similar to Python script file. + /// Looks up a localized string similar to Full path to Python script file. /// internal static string ScriptFileDescription { get { diff --git a/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.fr.resx b/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.fr.resx index 3ea71fd6..0f376fa9 100644 --- a/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.fr.resx +++ b/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.fr.resx @@ -1,4 +1,4 @@ - + - - + + - + - - - - + + + + - - + + - - + + - - - - + + + + - + - + @@ -271,15 +271,4 @@ Sortie - - - - - - - property name - - - - - + \ No newline at end of file diff --git a/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.ja.resx b/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.ja.resx index 3a9e5025..a553bedb 100644 --- a/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.ja.resx +++ b/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.ja.resx @@ -1,4 +1,4 @@ - + - - + + - + - - - - + + + + - - + + - - + + - - - - + + + + - + - + @@ -122,7 +122,8 @@ コード - property name + property name + Python オブジェクトの変換中にエラーが発生しました @@ -134,7 +135,8 @@ Python のオブジェクトを取得 - activity name + activity name + Python オブジェクトに対応する .NET の型です。 @@ -146,7 +148,8 @@ インスタンス - property name + property name + メソッド名が無効です @@ -161,7 +164,8 @@ Python メソッドの呼び出し - activity name + activity name + Python スクリプトをロードし、実行します。(Load Python Script) @@ -170,31 +174,36 @@ Python スクリプトをロード - activity name + activity name + 呼び出すメソッドの名前です。 名前 - property name + property name + コード/スクリプトが指定されていません 出力 - property name + property name + Python スクリプトの入力パラメーターです。 入力パラメーター - property name + property name + Python のホームパスです。 パス - property name + property name + Python エンジンセッションが見つかりませんでした @@ -206,19 +215,22 @@ Python オブジェクト - property name + property name + Python アクティビティコンテナーです。(Python Scope) Python スコープ - activity name + activity name + スクリプト呼び出しの結果です。 結果 - property name + property name + Python スクリプトアクティビティを呼び出します。(Run Python Script) @@ -227,13 +239,15 @@ Python スクリプトを実行 - activity name + activity name + Python スクリプトファイルです。 ファイル - property name + property name + 指定のスクリプトファイルは見つかりませんでした @@ -245,24 +259,16 @@ バージョン - property name + property name + ターゲット - property name + property name + Python のランタイムプラットフォームを指定します。 出力 - - - - - - property name - - - - - + \ No newline at end of file diff --git a/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.resx b/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.resx index 8f87c98b..4788885a 100644 --- a/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.resx +++ b/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.resx @@ -242,7 +242,7 @@ activity name - Python script file + Full path to Python script file File @@ -281,4 +281,7 @@ WorkingFolder path is not valid + + Selected version {0} is different from the version found {1} + \ No newline at end of file diff --git a/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.ru.resx b/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.ru.resx index e8ba504f..70a2241c 100644 --- a/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.ru.resx +++ b/Activities/Python/UiPath.Python.Activities/Properties/UiPath.Python.Activities.ru.resx @@ -1,4 +1,4 @@ - + - - + + - + - - - - + + + + - - + + - - + + - - - - + + + + - + - + @@ -271,15 +271,4 @@ Output - - - - - - - property name - - - - - + \ No newline at end of file diff --git a/Activities/Python/UiPath.Python.Activities/PythonScope.cs b/Activities/Python/UiPath.Python.Activities/PythonScope.cs index b506f34a..34a15c4d 100644 --- a/Activities/Python/UiPath.Python.Activities/PythonScope.cs +++ b/Activities/Python/UiPath.Python.Activities/PythonScope.cs @@ -115,6 +115,13 @@ protected override async Task> ExecuteAsync(Native { Trace.TraceError($"Error initializing Python engine: {e.ToString()}"); Cleanup(); + if (Version != Version.Auto) + { + Version autodetected = Version.Auto; + EngineProvider.Autodetect(path, out autodetected); + if (autodetected != Version.Auto && autodetected != Version) + throw new InvalidOperationException(string.Format(Resources.InvalidVersionException, Version.ToString(), autodetected.ToString())); + } throw new InvalidOperationException(Resources.PythonInitializeException, e); } diff --git a/Activities/Python/UiPath.Python.Tests/Runtimes.cs b/Activities/Python/UiPath.Python.Tests/Runtimes.cs index 8a1ca191..a8174ae1 100644 --- a/Activities/Python/UiPath.Python.Tests/Runtimes.cs +++ b/Activities/Python/UiPath.Python.Tests/Runtimes.cs @@ -76,18 +76,38 @@ public class Runtimes { new object[] { - @"C:\Python\python-2.7.0-x86", + @"C:\Python\python27-x86", Version.Python_27 }, new object[] { - @"C:\Python\python-3.5.4-x86", + @"C:\Python\python33-x86", + Version.Python_33 + }, + new object[] + { + @"C:\Python\python34-x86", + Version.Python_34 + }, + new object[] + { + @"C:\Python\python35-x86", Version.Python_35 }, new object[] { - @"C:\Python\python-3.6.4-x86", + @"C:\Python\python36-x86", Version.Python_36 + }, + new object[] + { + @"C:\Python\python37-x86", + Version.Python_37 + }, + new object[] + { + @"C:\Python\python38-x86", + Version.Python_38 } }; @@ -96,13 +116,28 @@ public class Runtimes { new object[] { - @"C:\Python\python-3.5.4-x64", + @"C:\Python\python27-x64", + Version.Python_27 + }, + new object[] + { + @"C:\Python\python35-x64", Version.Python_35 }, new object[] { - @"C:\Python\python-3.6.4-x64", + @"C:\Python\python36-x64", Version.Python_36 + }, + new object[] + { + @"C:\Python\python37-x64", + Version.Python_37 + }, + new object[] + { + @"C:\Python\python38-x64", + Version.Python_38 } }; @@ -112,6 +147,19 @@ public class Runtimes #region Test cases + [SkippableTheory] + [Trait(TestCategories.Category, Category)] + [MemberData(nameof(AllEngines))] + public void AutomaticVersionDetection(string path, Version version) + { + Skip.IfNot(ValidateRuntime(path)); + var target = X64Engines.Any(x => x[0].Equals(path) && x[1].Equals(version)) + ? TargetPlatform.x64 + : TargetPlatform.x86; + var engine = EngineProvider.Get(Version.Auto, path, true, target, true); + Assert.Equal(engine.Version, version); + } + [SkippableTheory] [Trait(TestCategories.Category, Category)] [MemberData(nameof(X86Engines))] diff --git a/Activities/Python/UiPath.Python/EngineProvider.cs b/Activities/Python/UiPath.Python/EngineProvider.cs index 3827cb13..996b4ccf 100644 --- a/Activities/Python/UiPath.Python/EngineProvider.cs +++ b/Activities/Python/UiPath.Python/EngineProvider.cs @@ -14,6 +14,7 @@ public static class EngineProvider { private const string PythonHomeEnv = "PYTHONHOME"; private const string PythonExe = "python.exe"; + private const string PythonVersionArgument = "--version"; // engines cache private static object _lock = new object(); @@ -30,7 +31,6 @@ public static IEngine Get(Version version, string path, bool inProcess = true, T path = Environment.GetEnvironmentVariable(PythonHomeEnv); Trace.TraceInformation($"Found Pyhton path {path}"); } - if (!version.IsValid()) { Autodetect(path, out version); @@ -58,7 +58,7 @@ public static IEngine Get(Version version, string path, bool inProcess = true, T return engine; } - private static void Autodetect(string path, out Version version) + public static void Autodetect(string path, out Version version) { Trace.TraceInformation($"Trying to autodetect Python version from path {path}"); string pyExe = Path.GetFullPath(Path.Combine(path, PythonExe)); @@ -66,9 +66,26 @@ private static void Autodetect(string path, out Version version) { throw new FileNotFoundException(Resources.PythonExeNotFoundException, pyExe); } - - version = FileVersionInfo.GetVersionInfo(pyExe).Get(); + Process process = new Process(); + process.StartInfo = new ProcessStartInfo() + { + UseShellExecute = false, + CreateNoWindow = true, + WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden, + FileName = pyExe, + Arguments = PythonVersionArgument, + RedirectStandardError = true, + RedirectStandardOutput = true + }; + process.Start(); + // Now read the value, parse to int and add 1 (from the original script) + string ver = process.StandardError.ReadToEnd(); + if(string.IsNullOrEmpty(ver)) + ver = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + version = ver.GetVersionFromStr(); Trace.TraceInformation($"Autodetected Python version {version}"); } + } } diff --git a/Activities/Python/UiPath.Python/IEngine.cs b/Activities/Python/UiPath.Python/IEngine.cs index de289bd2..162cff07 100644 --- a/Activities/Python/UiPath.Python/IEngine.cs +++ b/Activities/Python/UiPath.Python/IEngine.cs @@ -19,6 +19,7 @@ public enum TargetPlatform /// public interface IEngine : IDisposable { + Version Version { get; } #region Lifecycle Task Initialize(string workingFolder, CancellationToken ct); diff --git a/Activities/Python/UiPath.Python/Impl/DynamicStaticTypeMembers.cs b/Activities/Python/UiPath.Python/Impl/DynamicStaticTypeMembers.cs index 51d8e8a0..1cbada15 100644 --- a/Activities/Python/UiPath.Python/Impl/DynamicStaticTypeMembers.cs +++ b/Activities/Python/UiPath.Python/Impl/DynamicStaticTypeMembers.cs @@ -42,7 +42,7 @@ private DynamicStaticTypeMembers(Type type) [ContractInvariantMethod] private void ObjectInvariant() { - Contract.Invariant(this.type != null); + Contract.Invariant(type != null); } /// @@ -58,12 +58,12 @@ public override bool TryGetMember(GetMemberBinder binder, out object result) Contract.Assume(binder != null); Contract.Assume(binder.Name != null); - Trace.TraceEvent(TraceEventType.Verbose, 0, "Getting the value of static property " + binder.Name + " on type " + this.type.Name); + Trace.TraceEvent(TraceEventType.Verbose, 0, "Getting the value of static property " + binder.Name + " on type " + type.Name); - var prop = this.type.GetProperty(binder.Name, BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public); + var prop = type.GetProperty(binder.Name, BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public); if (prop == null) { - Trace.TraceEvent(TraceEventType.Error, 0, "Could not find static property " + binder.Name + " on type " + this.type.Name); + Trace.TraceEvent(TraceEventType.Error, 0, "Could not find static property " + binder.Name + " on type " + type.Name); result = null; return false; } @@ -85,12 +85,12 @@ public override bool TrySetMember(SetMemberBinder binder, object value) Contract.Assume(binder != null); Contract.Assume(binder.Name != null); - Trace.TraceEvent(TraceEventType.Verbose, 0, "Setting the value of static property " + binder.Name + " on type " + this.type.Name); + Trace.TraceEvent(TraceEventType.Verbose, 0, "Setting the value of static property " + binder.Name + " on type " + type.Name); - var prop = this.type.GetProperty(binder.Name, BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public); + var prop = type.GetProperty(binder.Name, BindingFlags.FlattenHierarchy | BindingFlags.Static | BindingFlags.Public); if (prop == null) { - Trace.TraceEvent(TraceEventType.Error, 0, "Could not find static property " + binder.Name + " on type " + this.type.Name); + Trace.TraceEvent(TraceEventType.Error, 0, "Could not find static property " + binder.Name + " on type " + type.Name); return false; } @@ -113,7 +113,7 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o Contract.Assume(binder.Name != null); Contract.Assume(args != null); - Trace.TraceEvent(TraceEventType.Verbose, 0, "Invoking static method " + binder.Name + " on type " + this.type.Name + " with argument types { " + string.Join(", ", args.Select(x => x == null ? "" : x.GetType().Name)) + " }"); + Trace.TraceEvent(TraceEventType.Verbose, 0, "Invoking static method " + binder.Name + " on type " + type.Name + " with argument types { " + string.Join(", ", args.Select(x => x == null ? "" : x.GetType().Name)) + " }"); // Convert any RefOutArg arguments into ref/out arguments var refArguments = new RefOutArg[args.Length]; @@ -132,7 +132,7 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o MethodBase method; try { - var methods = this.type.GetMethods(flags).Where(x => x.Name == binder.Name); + var methods = type.GetMethods(flags).Where(x => x.Name == binder.Name); Contract.Assume(Type.DefaultBinder != null); method = Type.DefaultBinder.BindToMethod(flags, methods.ToArray(), ref args, null, null, null, out state); Contract.Assume(method != null); @@ -140,14 +140,14 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o } catch (Exception ex) { - Trace.TraceEvent(TraceEventType.Error, 0, "Could not find static method " + binder.Name + " on type " + this.type.Name + ": [" + ex.GetType() + "] " + ex.Message); + Trace.TraceEvent(TraceEventType.Error, 0, "Could not find static method " + binder.Name + " on type " + type.Name + ": [" + ex.GetType() + "] " + ex.Message); throw; } // Ensure that all ref/out arguments were properly wrapped if (method.GetParameters().Count(x => x.ParameterType.IsByRef) != refArguments.Count(x => x != null)) { - throw new ArgumentException("ref/out parameters need a RefOutArg wrapper when invoking " + this.type.Name + "." + binder.Name + "."); + throw new ArgumentException("ref/out parameters need a RefOutArg wrapper when invoking " + type.Name + "." + binder.Name + "."); } // Invoke the method, allowing exceptions to propogate @@ -206,7 +206,7 @@ public static dynamic Create() /// A that represents this instance. public override string ToString() { - return this.type.Name; + return type.Name; } } } diff --git a/Activities/Python/UiPath.Python/Impl/Engine.cs b/Activities/Python/UiPath.Python/Impl/Engine.cs index a409d821..e38c1298 100644 --- a/Activities/Python/UiPath.Python/Impl/Engine.cs +++ b/Activities/Python/UiPath.Python/Impl/Engine.cs @@ -62,6 +62,7 @@ internal Engine(Version version, string path) } #region IEngine + public Version Version { get { return _version; } } public async Task Initialize(string workingFolder, CancellationToken ct) { if (!_initialized) @@ -89,7 +90,12 @@ public async Task Initialize(string workingFolder, CancellationToken ct) ct.ThrowIfCancellationRequested(); _pyEngine.PythonHome = _path; - _pyEngine.Initialize(null, null); + + //Pythonnet removed support for version 3.3 and 3.4 so we have the old dlls. Initialize method was updated in current package. + if (_version == Version.Python_33 || _version == Version.Python_34) + _pyEngine.Initialize(null, null); + else + _pyEngine.Initialize(null, null, null); ct.ThrowIfCancellationRequested(); _pythreads = _pyEngine.BeginAllowThreads(); diff --git a/Activities/Python/UiPath.Python/Impl/OutOfProcessEngine.cs b/Activities/Python/UiPath.Python/Impl/OutOfProcessEngine.cs index 1b758e61..4638ea1f 100644 --- a/Activities/Python/UiPath.Python/Impl/OutOfProcessEngine.cs +++ b/Activities/Python/UiPath.Python/Impl/OutOfProcessEngine.cs @@ -32,6 +32,7 @@ internal OutOfProcessEngine(Version version, string path, TargetPlatform target, } #region IEngine + public Version Version { get { return _version; } } public Task Initialize(string workingFolder, CancellationToken ct) { ct.ThrowIfCancellationRequested(); @@ -48,7 +49,7 @@ public Task Initialize(string workingFolder, CancellationToken ct) }; _provider.Create(); _proxy = new PythonProxy(_provider.Endpoint); - _proxy.Initialize(_path, _version, workingFolder); + _proxy.Initialize(_path, _version, workingFolder); sw.Stop(); diff --git a/Activities/Python/UiPath.Python/Properties/UiPath.Python.Designer.cs b/Activities/Python/UiPath.Python/Properties/UiPath.Python.Designer.cs index ba30fc85..eedade9e 100644 --- a/Activities/Python/UiPath.Python/Properties/UiPath.Python.Designer.cs +++ b/Activities/Python/UiPath.Python/Properties/UiPath.Python.Designer.cs @@ -19,7 +19,7 @@ namespace UiPath.Python.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class UiPath_Python { @@ -86,5 +86,14 @@ internal static string PythonRuntimeTypeException { return ResourceManager.GetString("PythonRuntimeTypeException", resourceCulture); } } + + /// + /// Looks up a localized string similar to Python version {0} is not supported. Supported versions are: {1}. + /// + internal static string UnsupportedVersionException { + get { + return ResourceManager.GetString("UnsupportedVersionException", resourceCulture); + } + } } } diff --git a/Activities/Python/UiPath.Python/Properties/UiPath.Python.fr.resx b/Activities/Python/UiPath.Python/Properties/UiPath.Python.fr.resx index c90809f9..f569cc7c 100644 --- a/Activities/Python/UiPath.Python/Properties/UiPath.Python.fr.resx +++ b/Activities/Python/UiPath.Python/Properties/UiPath.Python.fr.resx @@ -1,4 +1,4 @@ - + - - + + - + - - - - + + + + - - + + - - + + - - - - + + + + - + - + @@ -126,4 +126,4 @@ Python ランタイムの型/メソッド/プロパティが見つかりません: {0} - + \ No newline at end of file diff --git a/Activities/Python/UiPath.Python/Properties/UiPath.Python.resx b/Activities/Python/UiPath.Python/Properties/UiPath.Python.resx index 8871c1e5..1421672d 100644 --- a/Activities/Python/UiPath.Python/Properties/UiPath.Python.resx +++ b/Activities/Python/UiPath.Python/Properties/UiPath.Python.resx @@ -126,4 +126,7 @@ Python runtime type/method/property not found: {0} + + Python version {0} is not supported. Supported versions are: {1} + \ No newline at end of file diff --git a/Activities/Python/UiPath.Python/Properties/UiPath.Python.ru.resx b/Activities/Python/UiPath.Python/Properties/UiPath.Python.ru.resx index 4b2c0f29..67ab3d8b 100644 --- a/Activities/Python/UiPath.Python/Properties/UiPath.Python.ru.resx +++ b/Activities/Python/UiPath.Python/Properties/UiPath.Python.ru.resx @@ -1,4 +1,4 @@ - +