파이썬 - 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 버전을 설치하는 것이 더 좋겠습니다.
이후 대략적인 사용법은 아래의 글을 참고하시고. ^^
MSSQL 사용
; http://pythonstudy.xyz/python/article/208-MSSQL-사용
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]