Perl subroutine calltips - with PythonScript
-
hah, it is the other way around … from within the source call perl …
-
@Ekopalypse said in Perl subroutine calltips - with PythonScript:
D:\perl\bin>perl D:\temp\perl\Win32-Mechanize-NotepadPlusPlus-0.005\Makefile.PL Could not open 'lib/Win32/Mechanize/NotepadPlusPlus.pm': No such file or directory at D:/perl/lib/ExtUtils/MM_Unix.pm line 2973.
For the installation, you need to be in the
D:\temp\perl\Win32-Mechanize-NotepadPlusPlus-0.005\
directory, and rund:\perl\bin\perl Makefile.PL
instead: you need to be in the same directory as the Makefile.PL, so that the relative paths are all correct. -
and then I used nmake to create the pm’s.
I’ve copied the resulting Win32 to …/perl/lib/
but now I getCan't locate Win32/API.pm in @INC (you may need to install the Win32::API module) (@INC contains: d:/perl/site/lib d:/perl/lib) at d:/perl/lib/Win32/Mechanize/NotepadPlusPlus/Notepad.pm line 9.
-
The other thing I realized: you probably won’t have all the prerequisite modules installed. I normally use the cpanm utility, which distributes with strawberry perl, and that automatically downloads and installs prereqs before the module you’re trying to install. Without such a tool (and if you built your own perl, which I think you did to get the DLL), I don’t know that you have that.
I think the make process will tell you what prereqs you’re missing … but it’s been a long time since I’ve done a complicated manual install of a module.
Oh, yep, there, you posted the error while I was typing. You’re going to have to install at least Win32::API first… doing that manually is a pain.
When you built your own perl, did you at least get cpan, if not cpanm? I think one or both would be in the same directory as perl.exe… if you have cpanm, just do
cpanm Win32::Mechanize::NotepadPlusPlus
, and everything should work. If you have just cpan, I forget whether it handles prereqs; trycpan Win32::Mechanize::NotepadPlusPlus
; if that’s not sufficient, do the missing prereqs one at a time with thecpan
client. If you have neither… um… That’s going to be tough. -
@PeterJones said in Perl subroutine calltips - with PythonScript:
If you have just cpan, I forget whether it handles prereqs
I believe it does - I normally just use CPAN and it fetches what I need to build.
Cheers.
-
I have cpan and it keeps installing stuff - did I choose to install the world??
-
it does this now since ~10 minutes
-
finished - but no Win32::API. started cpan Win32::API now.
-
Is there a reason you build your own Perl? I have Strawberry 5.24 installed and doing this works:
That’s @Ekopalypse script from above using my “system” Strawberry Perl 5.24 DLL (the Perl that has my Win32::Mechanize::NotepadPlusPlus and all my other stull installed on it). Not sure why it’s printing “9” in the PythonScript console - is that what it’s supposed to do? I thought I’d get that string
"print something ...
Cheers.
-
I get also 9 and from the function it seems correct to return an int.
See my previous post. RunPerl returns only an int. Not sure how to get the result (the print output), so far. -
@Ekopalypse said in Perl subroutine calltips - with PythonScript:
I get also 9
Oh, OK - great then. Seems I may be able to keep testing along without having to build a Perl and just use my Strawberry install.
Cheers.
-
My Win32::API has been built but not installed because of failing tests I guess. Can you try the
"use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();"
and see what happens? -
This post is deleted! -
@Ekopalypse said in Perl subroutine calltips - with PythonScript:
Can you try
from ctypes import CDLL, POINTER, c_int, c_char_p perllib = CDLL(r'C:\Strawberry\perl\bin\perl524.dll') ["-le", "use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();"] perllib.RunPerl.restype = c_int perllib.RunPerl.argtypes = c_int, POINTER(c_char_p), POINTER(c_char_p) args = (c_char_p * 2)(b"-le", b"use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();") print(perllib.RunPerl(len(args),args, None))
It just prints
9
in the PythonScript console. No new tab is opened. If I run the command itself from a prompt:C:\ > perl -e "use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();"
I get a new tab in Notepad++ as expected.
At least if it printed
42
we’d know we’re on to something …Cheers.
-
Ja, 42 would be nice :-)
So 9 seems to be an error code. -
Can you try one more thing?
Replace the RunPerl call with this
print(perllib.RunPerl(len(args), args, (c_char_p * 1)(b'')))
With the newFile code, please. -
Same 9.
I tried both:
from ctypes import CDLL, POINTER, c_int, c_char_p perllib = CDLL(r'C:\Strawberry\perl\bin\perl524.dll') ["-e", "use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();"] perllib.RunPerl.restype = c_int perllib.RunPerl.argtypes = c_int, POINTER(c_char_p), POINTER(c_char_p) args = (c_char_p * 2)(b"-e", b"use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();") print(perllib.RunPerl(len(args),args,(c_char_p * 1)(b"use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();")))
and
from ctypes import CDLL, POINTER, c_int, c_char_p perllib = CDLL(r'C:\Strawberry\perl\bin\perl524.dll') ["-e", "use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();"] perllib.RunPerl.restype = c_int perllib.RunPerl.argtypes = c_int, POINTER(c_char_p), POINTER(c_char_p) args = (c_char_p * 2)(b"-e", b"use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();") print(perllib.RunPerl(len(args),args,(c_char_p * 1)(b'')))
HOWEVER … this:
from ctypes import CDLL, POINTER, c_int, c_char_p perllib = CDLL(r'C:\Strawberry\perl\bin\perl524.dll') ["use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();"] perllib.RunPerl.restype = c_int perllib.RunPerl.argtypes = c_int, POINTER(c_char_p), POINTER(c_char_p) args = (c_char_p * 1)(b"use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();") print(perllib.RunPerl(len(args),args,None))
produces
0
in the PythonScript console.Cheers.
-
Ok, I should have installed strawberry perl in first place, solved all my issues.
First success
from ctypes import CDLL, POINTER, c_int, c_char_p perllib = CDLL(r'D:\strawberry\perl\bin\perl532.dll') perllib.RunPerl.restype = c_int perllib.RunPerl.argtypes = c_int, POINTER(c_char_p), POINTER(c_char_p) __args = [b"", b"-le", b"use Win32::Mechanize::NotepadPlusPlus qw/:main/; notepad->newFile();"] args = (c_char_p * len(__args))(*__args) x = perllib.RunPerl(len(args), args, None) print(x)
This works, but only one time. A second call results in a
OSError: exception: access violation writing 0x0000000000000024
Seems some cleanup needs to be done afterwards.
-
@Ekopalypse said in Perl subroutine calltips - with PythonScript:
Seems some cleanup needs to be done afterwards.
Yes, in my late night Google-ing I saw lots of references to
free(args)
after theRunPerl()
call.Examples:
https://comp.lang.perl.misc.narkive.com/r7M6eENL/dll-unload-question-for-embedded-perl-on-windows
https://www.nntp.perl.org/group/perl.wxperl.users/2017/01/msg9715.htmlCheers.
-
@Ekopalypse said in Perl subroutine calltips - with PythonScript:
__args = [b"",
…Weird. If I don’t have the empty zeroth argument, the call fails (x==9). I wonder why it needs the blank argument…