Created
September 11, 2018 20:25
-
-
Save pydemo/0b85bd5d1c017f6873422e02aeb9618a to your computer and use it in GitHub Desktop.
read file in Cython
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from libc.stdio cimport * | |
cdef extern from "stdio.h": | |
#FILE * fopen ( const char * filename, const char * mode ) | |
FILE *fopen(const char *, const char *) | |
#int fclose ( FILE * stream ) | |
int fclose(FILE *) | |
#ssize_t getline(char **lineptr, size_t *n, FILE *stream); | |
ssize_t getline(char **, size_t *, FILE *) | |
def read_file_slow(filename): | |
f = open(filename, "rb") | |
while True: | |
line = f.readline() | |
if not line: break | |
#yield line | |
f.close() | |
return [] | |
def read_file(filename): | |
filename_byte_string = filename.encode("UTF-8") | |
cdef char* fname = filename_byte_string | |
cdef FILE* cfile | |
cfile = fopen(fname, "rb") | |
if cfile == NULL: | |
raise FileNotFoundError(2, "No such file or directory: '%s'" % filename) | |
cdef char * line = NULL | |
cdef size_t l = 0 | |
cdef ssize_t read | |
while True: | |
read = getline(&line, &l, cfile) | |
if read == -1: break | |
#yield line | |
fclose(cfile) | |
return [] |
I haven't used Cython for 2 years now, did you check the tutorial ? https://cython.readthedocs.io/en/latest/src/tutorial/external.html
I see a first import cython
before the example with from libc.stdlib cimport atoi
(probably similar to our from libc.stdio cimport FILE, fopen, fclose, getline
)
Which version of Cython do you use ?
Looking at your error code: "link failed with error code 1120" i suggest you to check this post: https://stackoverflow.com/questions/63750020/unresolved-external-symbol-error-when-linking-a-cython-extension-against-a-c-l
Or check more results when googling these terms.
All the best 😉
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@sylvain-ri Hi, I am trying to compile the pyx file using the command python.exe setup.py build_ext --inplace and my setup.py looks like this
I am getting a linking error on the compiler for unresolved symbol "getline"
c:\Projects\CythonProjects\FP-Creator\src\meshReader>c:\Py310\python.exe setup.py build_ext --inplace Compiling meshReader.pyx because it changed. [1/1] Cythonizing meshReader.pyx running build_ext building 'meshReader' extension "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\bin\HostX86\x64\cl.exe" /c /nologo /O2 /W3 /GL /DNDEBUG /MD -Ic:\Py310\include -Ic:\Py310\Include "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\ATLMFC\include" "-IC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\um" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\shared" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\winrt" "-IC:\Program Files (x86)\Windows Kits\10\\include\10.0.19041.0\\cppwinrt" "-IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um" /TcmeshReader.c /Fobuild\temp.win-amd64-3.10\Release\meshReader.obj meshReader.c meshReader.c(1674): warning C4013: 'getline' undefined; assuming extern returning int creating c:\Projects\CythonProjects\FP-Creator\src\meshReader\build\lib.win-amd64-3.10 "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\bin\HostX86\x64\link.exe" /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:c:\Py310\libs /LIBPATH:c:\Py310 /LIBPATH:c:\Py310\PCbuild\amd64 "/LIBPATH:C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\ATLMFC\lib\x64" "/LIBPATH:C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\\lib\10.0.19041.0\\um\x64" /EXPORT:PyInit_meshReader build\temp.win-amd64-3.10\Release\meshReader.obj /OUT:build\lib.win-amd64-3.10\meshReader.cp310-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.10\Release\meshReader.cp310-win_amd64.lib Creating library build\temp.win-amd64-3.10\Release\meshReader.cp310-win_amd64.lib and object build\temp.win-amd64-3.10\Release\meshReader.cp310-win_amd64.exp meshReader.obj : error LNK2001: unresolved external symbol getline build\lib.win-amd64-3.10\meshReader.cp310-win_amd64.pyd : fatal error LNK1120: 1 unresolved externals error: command 'C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.33.31629\\bin\\HostX86\\x64\\link.exe' failed with exit code 1120
my pyx looks like this: