Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Jul 22, 2023. It is now read-only.
/pythonnetPublic archive
forked frompythonnet/pythonnet

Commit9449a04

Browse files
committed
Merge branch 'fix-getPythonPath'
Closespythonnet#414
2 parents6f3f357 +ffe6448 commit9449a04

File tree

6 files changed

+101
-34
lines changed

6 files changed

+101
-34
lines changed

‎CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
5252
- Fixed`Py_Main` &`PySys_SetArgvEx``no mem error` on`UCS4/PY3` (#399)
5353
- Fixed`Python.Runtime.dll.config` on macOS (#120)
5454
- Fixed crash on`PythonEngine.Version` (#413)
55+
- Fixed`PythonEngine.PythonPath` issues (#414)
5556

5657
###Removed
5758

‎appveyor.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ init:
2727
# Put desired Python version first in PATH
2828
-set PATH=%PYTHON%;%PYTHON%\Scripts;%PATH%
2929

30+
# Needed for test `GetPythonHomeDefault`
31+
-set PYTHONHOME=%PYTHON%
32+
3033
install:
3134
-pip install --upgrade -r requirements.txt --quiet
3235

‎src/embed_tests/TestPythonEngineProperties.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,44 @@ public static void GetVersionDoesntCrash()
6666
Assert.IsTrue(s.Contains(","));
6767
}
6868
}
69+
70+
[Test]
71+
publicstaticvoidGetPythonPathDefault()
72+
{
73+
PythonEngine.Initialize();
74+
strings=PythonEngine.PythonPath;
75+
76+
StringAssert.Contains("python",s.ToLower());
77+
PythonEngine.Shutdown();
78+
}
79+
80+
[Test]
81+
publicstaticvoidGetProgramNameDefault()
82+
{
83+
PythonEngine.Initialize();
84+
strings=PythonEngine.PythonHome;
85+
86+
Assert.NotNull(s);
87+
PythonEngine.Shutdown();
88+
}
89+
90+
/// <summary>
91+
/// Test default behavior of PYTHONHOME. If ENVVAR is set it will
92+
/// return the same value. If not, returns EmptyString.
93+
/// </summary>
94+
/// <remarks>
95+
/// AppVeyor.yml has been update to tests with ENVVAR set.
96+
/// </remarks>
97+
[Test]
98+
publicstaticvoidGetPythonHomeDefault()
99+
{
100+
stringenvPythonHome=Environment.GetEnvironmentVariable("PYTHONHOME")??"";
101+
102+
PythonEngine.Initialize();
103+
stringenginePythonHome=PythonEngine.PythonHome;
104+
105+
Assert.AreEqual(envPythonHome,enginePythonHome);
106+
PythonEngine.Shutdown();
107+
}
69108
}
70109
}

‎src/runtime/CustomMarshaler.cs

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Python.Runtime
99
/// Abstract class defining boiler plate methods that
1010
/// Custom Marshalers will use.
1111
/// </summary>
12-
publicabstractclassMarshalerBase:ICustomMarshaler
12+
internalabstractclassMarshalerBase:ICustomMarshaler
1313
{
1414
publicobjectMarshalNativeToManaged(IntPtrpNativeData)
1515
{
@@ -39,9 +39,9 @@ public int GetNativeDataSize()
3939
/// Custom Marshaler to deal with Managed String to Native
4040
/// conversion differences on UCS2/UCS4.
4141
/// </summary>
42-
publicclassStrMarshaler:MarshalerBase
42+
internalclassUcsMarshaler:MarshalerBase
4343
{
44-
privatestaticreadonlyMarshalerBaseInstance=newStrMarshaler();
44+
privatestaticreadonlyMarshalerBaseInstance=newUcsMarshaler();
4545
privatestaticreadonlyEncodingPyEncoding=Runtime.PyEncoding;
4646

4747
publicoverrideIntPtrMarshalManagedToNative(objectmanagedObj)
@@ -72,14 +72,41 @@ public static ICustomMarshaler GetInstance(string cookie)
7272
{
7373
returnInstance;
7474
}
75+
76+
publicstaticstringPtrToStringUni(IntPtrp)
77+
{
78+
if(p==IntPtr.Zero)
79+
{
80+
returnnull;
81+
}
82+
83+
intsize=GetUnicodeByteLength(p);
84+
varbuffer=newbyte[size];
85+
Marshal.Copy(p,buffer,0,size);
86+
returnPyEncoding.GetString(buffer,0,size);
87+
}
88+
89+
publicstaticintGetUnicodeByteLength(IntPtrp)
90+
{
91+
varlen=0;
92+
while(true)
93+
{
94+
intc=Runtime.UCS==2
95+
?Marshal.ReadInt16(p,len*2)
96+
:Marshal.ReadInt32(p,len*4);
97+
98+
if(c==0)returnlen*Runtime.UCS;
99+
checked{++len;}
100+
}
101+
}
75102
}
76103

77104

78105
/// <summary>
79106
/// Custom Marshaler to deal with Managed String Arrays to Native
80107
/// conversion differences on UCS2/UCS4.
81108
/// </summary>
82-
publicclassStrArrayMarshaler:MarshalerBase
109+
internalclassStrArrayMarshaler:MarshalerBase
83110
{
84111
privatestaticreadonlyMarshalerBaseInstance=newStrArrayMarshaler();
85112
privatestaticreadonlyEncodingPyEncoding=Runtime.PyEncoding;
@@ -134,7 +161,7 @@ public static ICustomMarshaler GetInstance(string cookie)
134161
/// If instead we used `MarshalAs(UnmanagedType.LPWStr)` the output to
135162
/// `foo` would be `f\x00o\x00o\x00`.
136163
/// </remarks>
137-
publicclassUtf8Marshaler:MarshalerBase
164+
internalclassUtf8Marshaler:MarshalerBase
138165
{
139166
privatestaticreadonlyMarshalerBaseInstance=newUtf8Marshaler();
140167
privatestaticreadonlyEncodingPyEncoding=Encoding.UTF8;

‎src/runtime/pythonengine.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ public static string ProgramName
5757
{
5858
get
5959
{
60-
stringresult=Runtime.Py_GetProgramName();
61-
if(result==null)
62-
{
63-
return"";
64-
}
65-
returnresult;
60+
IntPtrp=Runtime.Py_GetProgramName();
61+
stringresult=Runtime.IsPython3
62+
?UcsMarshaler.PtrToStringUni(p)
63+
:Marshal.PtrToStringAnsi(p);
64+
65+
returnresult??"";
6666
}
6767
set{Runtime.Py_SetProgramName(value);}
6868
}
@@ -71,12 +71,12 @@ public static string PythonHome
7171
{
7272
get
7373
{
74-
stringresult=Runtime.Py_GetPythonHome();
75-
if(result==null)
76-
{
77-
return"";
78-
}
79-
returnresult;
74+
IntPtrp=Runtime.Py_GetPythonHome();
75+
stringresult=Runtime.IsPython3
76+
?UcsMarshaler.PtrToStringUni(p)
77+
:Marshal.PtrToStringAnsi(p);
78+
79+
returnresult??"";
8080
}
8181
set{Runtime.Py_SetPythonHome(value);}
8282
}
@@ -85,12 +85,12 @@ public static string PythonPath
8585
{
8686
get
8787
{
88-
stringresult=Runtime.Py_GetPath();
89-
if(result==null)
90-
{
91-
return"";
92-
}
93-
returnresult;
88+
IntPtrp=Runtime.Py_GetPath();
89+
stringresult=Runtime.IsPython3
90+
?UcsMarshaler.PtrToStringUni(p)
91+
:Marshal.PtrToStringAnsi(p);
92+
93+
returnresult??"";
9494
}
9595
set{Runtime.Py_SetPath(value);}
9696
}

‎src/runtime/runtime.cs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -683,46 +683,43 @@ public static extern int Py_Main(
683683

684684
#ifPYTHON3
685685
[DllImport(PythonDll)]
686-
[return:MarshalAs(UnmanagedType.LPWStr)]
687-
internalstaticexternstringPy_GetProgramName();
686+
internalstaticexternIntPtr Py_GetProgramName();
688687

689688
[DllImport(PythonDll)]
690689
internalstaticexternvoidPy_SetProgramName(
691690
[MarshalAs(UnmanagedType.LPWStr)]stringname
692691
);
693692

694693
[DllImport(PythonDll)]
695-
[return:MarshalAs(UnmanagedType.LPWStr)]
696-
internalstaticexternstringPy_GetPythonHome();
694+
internalstaticexternIntPtr Py_GetPythonHome();
697695

698696
[DllImport(PythonDll)]
699697
internalstaticexternvoidPy_SetPythonHome(
700698
[MarshalAs(UnmanagedType.LPWStr)]stringhome
701699
);
702700

703701
[DllImport(PythonDll)]
704-
[return:MarshalAs(UnmanagedType.LPWStr)]
705-
internalstaticexternstringPy_GetPath();
702+
internalstaticexternIntPtr Py_GetPath();
706703

707704
[DllImport(PythonDll)]
708705
internalstaticexternvoidPy_SetPath(
709706
[MarshalAs(UnmanagedType.LPWStr)]stringhome
710707
);
711708
#elifPYTHON2
712709
[DllImport(PythonDll)]
713-
internalstaticexternstringPy_GetProgramName();
710+
internalstaticexternIntPtr Py_GetProgramName();
714711

715712
[DllImport(PythonDll)]
716713
internalstaticexternvoidPy_SetProgramName(stringname);
717714

718715
[DllImport(PythonDll)]
719-
internalstaticexternstringPy_GetPythonHome();
716+
internalstaticexternIntPtr Py_GetPythonHome();
720717

721718
[DllImport(PythonDll)]
722719
internalstaticexternvoidPy_SetPythonHome(stringhome);
723720

724721
[DllImport(PythonDll)]
725-
internalstaticexternstringPy_GetPath();
722+
internalstaticexternIntPtr Py_GetPath();
726723

727724
[DllImport(PythonDll)]
728725
internalstaticexternvoidPy_SetPath(stringhome);
@@ -1242,7 +1239,7 @@ internal static bool PyUnicode_Check(IntPtr ob)
12421239
[DllImport(PythonDll)]
12431240
internalstaticexternIntPtrPyUnicode_FromKindAndData(
12441241
intkind,
1245-
[MarshalAs(UnmanagedType.CustomMarshaler,MarshalTypeRef=typeof(StrMarshaler))]string s,
1242+
[MarshalAs(UnmanagedType.CustomMarshaler,MarshalTypeRef=typeof(UcsMarshaler))]string s,
12461243
intsize
12471244
);
12481245

@@ -1268,7 +1265,7 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size)
12681265

12691266
[DllImport(PythonDll,EntryPoint=PyUnicodeEntryPoint+ "FromUnicode")]
12701267
internalstaticexternIntPtr PyUnicode_FromUnicode(
1271-
[MarshalAs(UnmanagedType.CustomMarshaler,MarshalTypeRef=typeof(StrMarshaler))]strings,
1268+
[MarshalAs(UnmanagedType.CustomMarshaler,MarshalTypeRef=typeof(UcsMarshaler))]strings,
12721269
intsize
12731270
);
12741271

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp