파이썬 - pymssql 설치 관련 오류 정리
원래 설치는 이렇게 끝낼 수 있습니다.
$ python -m pip install pymssql
Defaulting to user installation because normal site-packages is not writeable
Collecting pymssql
Downloading pymssql-2.2.7-cp311-cp311-manylinux_2_24_x86_64.whl (3.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2/3.2 MB 8.8 MB/s eta 0:00:00
Installing collected packages: pymssql
Successfully installed pymssql-2.2.7
Python 3.8의 경우 2.1.0 ~ 2.1.4 버전을 설치할 때 이런 오류가 발생할 수 있습니다.
# pip install pymssql==2.1.0
Collecting pymssql==2.1.0
Using cached pymssql-2.1.0.zip (2.5 MB)
Preparing metadata (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [10 lines of output]
/usr/local/lib/python3.8/site-packages/setuptools/dist.py:51: DistDeprecationWarning: Do not call this function
warnings.warn("Do not call this function", DistDeprecationWarning)
Traceback (most recent call last):
File "<string>", line 2, in <module>
File "<pip-setuptools-caller>", line 34, in <module>
File "/tmp/pip-install-r3vg2u62/pymssql_48a48fb60ec742fca2da191448d9bc72/setup.py", line 131, in <module>
print("setup.py: platform.linux_distribution() => %r" % (platform.linux_distribution(),))
AttributeError: module 'platform' has no attribute 'linux_distribution'
setup.py: platform.system() => 'Linux'
setup.py: platform.architecture() => ('64bit', 'ELF')
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed
× Encountered error while generating package metadata.
╰─> See above for output.
note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
Python 3.7부터 완전히 삭제된
platform.linux_distribution을 사용하기 때문인데, 2.1.5 버전에서 수정했다고 합니다. 따라서 Python을 3.6 이하로 내리든가, 아니면 pymssql 버전을 2.1.5 이상의 버전을 사용해야 합니다.
파이썬의 버전에 따라 2.0.0 ~ 2.2.0 버전을 설치하는 경우 다음의 문제가 발생한다면?
$ python3.11 -m pip install pymssql==2.2.0
...[생략]...
x86_64-linux-gnu-gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -fPIC -I/usr/include/python3.11 -c src/pymssql/_mssql.c -o build/temp.linux-x86_64-cpython-311/src/pymssql/_mssql.o -DMSDBLIB
src/pymssql/_mssql.c:747:10: fatal error: sqlfront.h: No such file or directory
747 | #include "sqlfront.h"
| ^~~~~~~~~~~~
compilation terminated.
error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for pymssql
Failed to build pymssql
ERROR: Could not build wheels for pymssql, which is required to install pyproject.toml-based projects
다행히 해결 방법이 있고,
failed to build: Cannot open include file: 'sqlfront.h': No such file or directory #372
; https://github.com/pymssql/pymssql/issues/372
Ubuntu의 경우, freetds-dev를 다음과 같이 설치하면 됩니다.
$ sudo apt install freetds-dev
마지막으로 2.0.0 버전 이하를 설치하면 아래와 같이 복잡한 오류가 발생하는 경우도 있을 것입니다.
# pip install pymssql==2.0.0
Collecting pymssql==2.0.0
Using cached pymssql-2.0.0.zip (2.4 MB)
Preparing metadata (setup.py) ... error
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-o_z_7v5i/pymssql_35aeb37a9a8e46b098a7d5cbf4b78fbb/setup.py'"'"'; __file__='"'"'/tmp/pip-install-o_z_7v5i/pymssql_35aeb37a9a8e46b098a7d5cbf4b78fbb/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-dcnnrk4u
cwd: /tmp/pip-install-o_z_7v5i/pymssql_35aeb37a9a8e46b098a7d5cbf4b78fbb/
Complete output (14 lines):
/usr/local/lib/python3.6/site-packages/setuptools/dist.py:51: DistDeprecationWarning: Do not call this function
warnings.warn("Do not call this function", DistDeprecationWarning)
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-install-o_z_7v5i/pymssql_35aeb37a9a8e46b098a7d5cbf4b78fbb/setup.py", line 412, in <module>
long_description = open('README.rst').read() +"\n\n" + open('ChangeLog_highlights.rst').read(),
FileNotFoundError: [Errno 2] No such file or directory: 'ChangeLog_highlights.rst'
setup.py: platform.system() => 'Linux'
setup.py: platform.architecture() => ('64bit', 'ELF')
setup.py: platform.linux_distribution() => ('debian', '10.12', '')
setup.py: platform.libc_ver() => ('glibc', '2.2.5')
setup.py: Not using bundled FreeTDS
setup.py: include_dirs = ['/usr/local/include']
setup.py: library_dirs = ['/usr/local/lib']
----------------------------------------
WARNING: Discarding https://files.pythonhosted.org/packages/43/8a/39276b764d4f57ea1950c600a87c567ab5e1ec70c646390084f9a26ec74e/pymssql-2.0.0.zip#sha256=848341594f399d9cf6dd47663e01403b22ac6cffe80914d10f3b6cc1dd43b8f4 (from https://pypi.org/simple/pymssql/). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
Using cached pymssql-2.0.0.tar.gz (2.4 MB)
Preparing metadata (setup.py) ... done
Building wheels for collected packages: pymssql
Building wheel for pymssql (setup.py) ... error
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-o_z_7v5i/pymssql_3da1f94548ef4cc7be30c239703c18ae/setup.py'"'"'; __file__='"'"'/tmp/pip-install-o_z_7v5i/pymssql_3da1f94548ef4cc7be30c239703c18ae/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-rs7um03z
cwd: /tmp/pip-install-o_z_7v5i/pymssql_3da1f94548ef4cc7be30c239703c18ae/
Complete output (27 lines):
/usr/local/lib/python3.6/site-packages/setuptools/dist.py:51: DistDeprecationWarning: Do not call this function
warnings.warn("Do not call this function", DistDeprecationWarning)
setup.py: platform.system() => 'Linux'
setup.py: platform.architecture() => ('64bit', 'ELF')
setup.py: platform.linux_distribution() => ('debian', '10.12', '')
setup.py: platform.libc_ver() => ('glibc', '2.2.5')
setup.py: Not using bundled FreeTDS
setup.py: include_dirs = ['/usr/local/include']
setup.py: library_dirs = ['/usr/local/lib']
running bdist_wheel
running build
running build_ext
building '_mssql' extension
creating build
creating build/temp.linux-x86_64-3.6
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/include -I/usr/local/include/python3.6m -c _mssql.c -o build/temp.linux-x86_64-3.6/_mssql.o -DMSDBLIB
_mssql.c: In function ‘__pyx_f_6_mssql__tds_ver_str_to_constant’:
_mssql.c:15426:15: error: ‘DBVERSION_80’ undeclared (first use in this function); did you mean ‘DBVERSION_70’?
__pyx_r = DBVERSION_80;
^~~~~~~~~~~~
DBVERSION_70
_mssql.c:15426:15: note: each undeclared identifier is reported only once for each function it appears in
At top level:
_mssql.c:3331:12: warning: ‘__pyx_f_6_mssql_db_sqlexec’ defined but not used [-Wunused-function]
static int __pyx_f_6_mssql_db_sqlexec(DBPROCESS *__pyx_v_dbproc) {
^~~~~~~~~~~~~~~~~~~~~~~~~~
error: command 'gcc' failed with exit status 1
----------------------------------------
ERROR: Failed building wheel for pymssql
Running setup.py clean for pymssql
Failed to build pymssql
Installing collected packages: pymssql
Running setup.py install for pymssql ... error
ERROR: Command errored out with exit status 1:
command: /usr/local/bin/python -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-o_z_7v5i/pymssql_3da1f94548ef4cc7be30c239703c18ae/setup.py'"'"'; __file__='"'"'/tmp/pip-install-o_z_7v5i/pymssql_3da1f94548ef4cc7be30c239703c18ae/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-yql3imw_/install-record.txt --single-version-externally-managed --compile --install-headers /usr/local/include/python3.6m/pymssql
cwd: /tmp/pip-install-o_z_7v5i/pymssql_3da1f94548ef4cc7be30c239703c18ae/
Complete output (27 lines):
/usr/local/lib/python3.6/site-packages/setuptools/dist.py:51: DistDeprecationWarning: Do not call this function
warnings.warn("Do not call this function", DistDeprecationWarning)
setup.py: platform.system() => 'Linux'
setup.py: platform.architecture() => ('64bit', 'ELF')
setup.py: platform.linux_distribution() => ('debian', '10.12', '')
setup.py: platform.libc_ver() => ('glibc', '2.2.5')
setup.py: Not using bundled FreeTDS
setup.py: include_dirs = ['/usr/local/include']
setup.py: library_dirs = ['/usr/local/lib']
running install
running build
running build_ext
building '_mssql' extension
creating build
creating build/temp.linux-x86_64-3.6
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/include -I/usr/local/include/python3.6m -c _mssql.c -o build/temp.linux-x86_64-3.6/_mssql.o -DMSDBLIB
_mssql.c: In function ‘__pyx_f_6_mssql__tds_ver_str_to_constant’:
_mssql.c:15426:15: error: ‘DBVERSION_80’ undeclared (first use in this function); did you mean ‘DBVERSION_70’?
__pyx_r = DBVERSION_80;
^~~~~~~~~~~~
DBVERSION_70
_mssql.c:15426:15: note: each undeclared identifier is reported only once for each function it appears in
At top level:
_mssql.c:3331:12: warning: ‘__pyx_f_6_mssql_db_sqlexec’ defined but not used [-Wunused-function]
static int __pyx_f_6_mssql_db_sqlexec(DBPROCESS *__pyx_v_dbproc) {
^~~~~~~~~~~~~~~~~~~~~~~~~~
error: command 'gcc' failed with exit status 1
----------------------------------------
ERROR: Command errored out with exit status 1: /usr/local/bin/python -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-o_z_7v5i/pymssql_3da1f94548ef4cc7be30c239703c18ae/setup.py'"'"'; __file__='"'"'/tmp/pip-install-o_z_7v5i/pymssql_3da1f94548ef4cc7be30c239703c18ae/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-yql3imw_/install-record.txt --single-version-externally-managed --compile --install-headers /usr/local/include/python3.6m/pymssql Check the logs for full command output.
아래의 글에도 나오지만,
pymssql-2.1.3 ‘DBVERSION_80’ undeclared (first use in this function); did you mean ‘DBVERSION_70’?
; https://github.com/pymssql/pymssql/issues/520
"/usr/include/sybdb.h" 파일의 내용에서 DBVERSION_80 상수를 이런 식으로,
#define DBVERSION_80 DBVERSION_71
추가해 주면 됩니다. 혹은 그냥, 아예 2.1.4 버전을 설치하는 것이 더 좋겠습니다.
근래에는 다음과 같이 krb5 관련 라이브러리가 없다는 에러가 발생할 수 있습니다.
$ python -m pip install pymssql
Collecting pymssql
Downloading pymssql-2.3.2.tar.gz (184 kB)
...[생략]...
running build_ext
Compiling src/pymssql/_mssql.pyx because it changed.
[1/1] Cythonizing src/pymssql/_mssql.pyx
building 'pymssql._mssql' extension
creating build/temp.linux-x86_64-cpython-38/src/pymssql
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -fPIC -I/usr/local/include -I/home/kevin/py38v/debug_fastapi_router/include -I/usr/include/python3.8 -c src/pymssql/_mssql.c -o build/temp.linux-x86_64-cpython-38/src/pymssql/_mssql.o -DMSDBLIB
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fwrapv -O2 build/temp.linux-x86_64-cpython-38/src/pymssql/_mssql.o -L/usr/local/lib -L/usr/lib -lsybdb -lgssapi_krb5 -lkrb5 -lssl -lcrypto -o build/lib.linux-x86_64-cpython-38/pymssql/_mssql.cpython-38-x86_64-linux-gnu.so
/usr/bin/ld: cannot find -lgssapi_krb5
/usr/bin/ld: cannot find -lkrb5
collect2: error: ld returned 1 exit status
/tmp/pip-build-env-7vzsyx13/overlay/lib/python3.8/site-packages/setuptools/_distutils/dist.py:261: UserWarning: Unknown distribution option: 'tests_require'
warnings.warn(msg)
error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for pymssql
이런 경우 libkrb5-dev를 함께 설치해 주면 됩니다.
$ sudo apt install libkrb5-dev
또는 이렇게 ssl, crypto 라이브러리를 찾지 못한다면?
gcc -pthread -shared -Wl,--strip-all build/temp.linux-x86_64-cpython-38/src/pymssql/_mssql.o -L/usr/local/lib -L/usr/local/lib -lsybdb -lgssapi_krb5 -lkrb5 -lssl -lcrypto -o build/lib.linux-x86_64-cpython-38/pymssql/_mssql.cpython-38-x86_64-linux-gnu.so
/usr/bin/ld: cannot find -lssl
/usr/bin/ld: cannot find -lcrypto
collect2: error: ld returned 1 exit status
/tmp/pip-build-env-0xkuezu9/overlay/lib/python3.8/site-packages/setuptools/_distutils/dist.py:261: UserWarning: Unknown distribution option: 'tests_require'
warnings.warn(msg)
error: command '/usr/bin/gcc' failed with exit code 1
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for pymssql
Failed to build pymssql
[notice] A new release of pip is available: 24.3.1 -> 25.0.1
[notice] To update, run: pip install --upgrade pip
ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (pymssql)
libssl-dev만 더 설치하면 됩니다.
$ sudo apt install libssl-dev -y
이후 대략적인 사용법은 아래의 글을 참고하시고. ^^
MSSQL 사용
; http://pythonstudy.xyz/python/article/208-MSSQL-사용
어느 순간부터 ^^; Python 3.8 환경에서 설치할 때 이런 오류가 발생합니다.
# python --version
Python 3.8.12
# python -m pip install pymssql
Collecting pymssql
Using cached pymssql-2.3.4.tar.gz (184 kB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing metadata (pyproject.toml) ... done
Building wheels for collected packages: pymssql
Building wheel for pymssql (pyproject.toml) ... error
error: subprocess-exited-with-error
× Building wheel for pymssql (pyproject.toml) did not run successfully.
│ exit code: 1
╰─> [108 lines of output]
prefix='/usr/local'
setup.py: platform.system() => Linux
setup.py: platform.architecture() => ('64bit', 'ELF')
setup.py: platform.libc_ver() => ('glibc', '2.28')
setup.py: include_dirs => ['/usr/local/include']
setup.py: library_dirs => ['/usr/local/lib']
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-cpython-38
creating build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/exceptions.py -> build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/__init__.py -> build/lib.linux-x86_64-cpython-38/pymssql
running egg_info
writing src/pymssql.egg-info/PKG-INFO
writing dependency_links to src/pymssql.egg-info/dependency_links.txt
writing top-level names to src/pymssql.egg-info/top_level.txt
ERROR setuptools_scm._file_finders.git listing git files failed - pretending there aren't any
reading manifest file 'src/pymssql.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
adding license file 'LICENSE'
writing manifest file 'src/pymssql.egg-info/SOURCES.txt'
copying src/pymssql/__init__.pyi -> build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/_mssql.pxd -> build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/_mssql.pyi -> build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/_mssql.pyx -> build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/_pymssql.pyi -> build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/_pymssql.pyx -> build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/exceptions.pyi -> build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/py.typed -> build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/sqlfront.pxd -> build/lib.linux-x86_64-cpython-38/pymssql
copying src/pymssql/version.h -> build/lib.linux-x86_64-cpython-38/pymssql
running build_ext
Error compiling Cython file:
------------------------------------------------------------
...
elif dbtype == SQLINT4:
return int(<int>(<DBINT *>data)[0])
elif dbtype == SQLINT8:
return long(<PY_LONG_LONG>(<PY_LONG_LONG *>data)[0])
^
------------------------------------------------------------
src/pymssql/_mssql.pyx:858:19: undeclared name not builtin: long
Compiling src/pymssql/_mssql.pyx because it changed.
[1/1] Cythonizing src/pymssql/_mssql.pyx
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
main()
File "/usr/local/lib/python3.8/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
json_out['return_val'] = hook(**hook_input['kwargs'])
File "/usr/local/lib/python3.8/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 251, in build_wheel
return _build_backend().build_wheel(wheel_directory, config_settings,
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/build_meta.py", line 415, in build_wheel
return self._build_with_temp_dir(
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/build_meta.py", line 397, in _build_with_temp_dir
self.run_setup()
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/build_meta.py", line 497, in run_setup
super().run_setup(setup_script=setup_script)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/build_meta.py", line 313, in run_setup
exec(code, locals())
File "<string>", line 295, in <module>
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/__init__.py", line 103, in setup
return distutils.core.setup(**attrs)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/core.py", line 184, in setup
return run_commands(dist)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/core.py", line 200, in run_commands
dist.run_commands()
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/dist.py", line 970, in run_commands
self.run_command(cmd)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/dist.py", line 974, in run_command
super().run_command(command)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/dist.py", line 989, in run_command
cmd_obj.run()
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/command/bdist_wheel.py", line 373, in run
self.run_command("build")
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/cmd.py", line 316, in run_command
self.distribution.run_command(command)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/dist.py", line 974, in run_command
super().run_command(command)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/dist.py", line 989, in run_command
cmd_obj.run()
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/command/build.py", line 135, in run
self.run_command(cmd_name)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/cmd.py", line 316, in run_command
self.distribution.run_command(command)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/dist.py", line 974, in run_command
super().run_command(command)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/dist.py", line 989, in run_command
cmd_obj.run()
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/command/build_ext.py", line 359, in run
self.build_extensions()
File "<string>", line 187, in build_extensions
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/command/build_ext.py", line 479, in build_extensions
self._build_extensions_serial()
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/setuptools/_distutils/command/build_ext.py", line 505, in _build_extensions_serial
self.build_extension(ext)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/Cython/Distutils/build_ext.py", line 131, in build_extension
new_ext = cythonize(
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/Cython/Build/Dependencies.py", line 1145, in cythonize
cythonize_one(*args)
File "/tmp/pip-build-env-k85dypw8/overlay/lib/python3.8/site-packages/Cython/Build/Dependencies.py", line 1289, in cythonize_one
raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: src/pymssql/_mssql.pyx
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for pymssql
Failed to build pymssql
분명히 PyPI의
pymssql 2.3.4 패키지 정보에는 파이썬 3.8을 지원한다고 돼 있지만 오류가 발생하는 것입니다.
pymssql의 이력에서 테스트해 보면, (2024-08-26) 2.3.1까지는 잘 설치가 되고 (2024-11-21) 2.3.2부터 저런 오류가 발생합니다. 이게 특정 환경을 타는 것 같은데 세부적인 차이점을 살펴보려니 귀찮아서 이번에는 그냥 넘어갑니다. ^^;
참고로, github의 해당 소스코드를 가보면 가보면,
pymssql/src/pymssql/_mssql.pyx
; https://github.com/pymssql/pymssql/blob/master/src/pymssql/_mssql.pyx#L857
실제로 다음과 같은 코드가 있습니다.
elif dbtype == SQLINT4:
return int(<int>(<DBINT *>data)[0])
elif dbtype == SQLINT8:
return long(<PY_LONG_LONG>(<PY_LONG_LONG *>data)[0])
재미있는 건, Cython의 오류 메시지에 "src/pymssql/_mssql.pyx:858:19: undeclared name not builtin: long"라는 걸로 봐서 "long" 타입을 지원하지 않는다는 듯한데요, 혹시나 싶어 다음의 예제로
동일한 머신에서 Cython 테스트를 했더니,
def lsum(long a, long b):
return a + b
정상적으로 컴파일이 돼 패키지가 잘 설치됐습니다. 내부 구조가 어떻게 돌아가는 것인지 모르겠군요. ^^; 혹시 이에 대해 아시는 분이 계시면 댓글로 알려주시면 감사하겠습니다. ^^;
(어쨌든 결론은, 저런 경우 2.3.1 버전 이하의 pymssql을 설치해야 합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]