파이썬 에러 Fatal error in launcher: Unable to create process using
에러 환경
OS: Windows10
Python: 3.8.6
에러 원인
대부분 python, pip의 경로가 서로 다르거나 권한이 없을때 에러가 발생합니다.
Fatal error in launcher: Unable to create process using '"d:\python_test\testpy\scripts\python.exe" "D:\Python_test\Testpy\Scripts\pip.exe" install IP2Location':
??? ??? ?? ? ????.
해결 방안
방법1.
python -m 명령어를 사용하여 pip를 사용하거나 pip를 재설치합니다.
# python -m 명령어를 사용하여 pip 사용
python -m pip install 패키지
# pip 재설치
python -m pip install --upgrade --force-reinstall pip
ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server side
에러 환경
Client OS: Windows10
Server OS: Ubuntu 22.04.2 LTS
MySQL: 8.0.30
에러 원인
LOAD DATA LOCAL 명령어 사용시 서버측에서 권한이 없을때 발생합니다.
해결 방안
1. local_infile 권한이 있는지 확인합니다.
SHOW GLOBAL VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | OFF |
+---------------+-------+
1 row in set (0.00 sec)
2. local_infile 권한이 OFF이면 명령어를 사용하여 ON으로 변경합니다.
SET GLOBAL local_infile=1;
Query OK, 0 rows affected (0.00 sec)
SHOW GLOBAL VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
1 row in set (0.00 sec)
3. 테스트
LOAD DATA LOCAL
INFILE 'TEST_DATA.CSV'
INTO TABLE
`test_data_info`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 LINES;
Query OK, 2964908 rows affected (20.86 sec)
LOAD DATA LOCAL
INFILE 'TEST_DATA.CSV'
INTO TABLE
`test_data_info`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 LINES;
Query OK, 2964908 rows affected (20.86 sec)
정적 라이브러리를 사용할꺼면 cryptlib, 동적 라이브러리를 사용할꺼면 cryptdll 프로젝트를 시작프로젝트로 설정후 빌드합니다.
저는 정적 라이브러리로 빌드하여 위와같이 cryptlib.lib 파일이 생성되었습니다.
2. 라이브러리 사용하기
이제 라이브러리 테스트를 해볼 프로젝트를 만들어 봅시다.
프로젝트를 만들었으면 아래와 같이 프로젝트 속성을 설정해 줍니다.
C/C++ -> 일반 -> 추가 포함 디렉터리: cryptopp 라이브러리 헤더파일이 있는곳으로 설정합니다.
C/C++ -> 코드 생성 -> 런타임 라이브러리를 다중 스레드(/MT)로 변경해줍니다.
링커 -> 일반 -> 추가 라이브러리 디렉터리를 Crypto++ 라이브러리를 빌드해서 생긴 lib파일이 있는곳으로 설정합니다.
링커 -> 입력 -> 추가 종속성에 lib파일 정보를 설정합니다.
#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;
typedef unsigned char byte;
typedef unsigned long long word64;
#include <base64.h>
using CryptoPP::Base64Encoder;
using CryptoPP::Base64Decoder;
void main()
{
string stringTest = "Ruru TestString";
string encTest, decTest;
/* 인코딩 시작 */
Base64Encoder encoder;
encoder.Put((const byte*)stringTest.data(), stringTest.size());
encoder.MessageEnd();
word64 encSize = encoder.MaxRetrievable();
if (encSize)
{
encTest.resize(encSize);
encoder.Get((byte*)&encTest[0], encTest.size());
}
cout << "Base64 Encode: " << encTest << endl;
/* 디코딩 시작 */
Base64Decoder decoder;
decoder.Put((byte*)encTest.data(), encTest.size());
decoder.MessageEnd();
word64 decSize = decoder.MaxRetrievable();
if (decSize && decSize <= SIZE_MAX)
{
decTest.resize(decSize);
decoder.Get((byte*)&decTest[0], decTest.size());
}
cout << "Base64 Decode: " << decTest << endl;
}
다음은 문자열을 Base64 인코딩, 디코딩 하는 코드입니다. Crypto++ 라이브러리의 네임스페이스는 CryptoPP를 사용합니다.
빌드를 하면 정상적으로 동작하는것을 확인할 수 있습니다.
Linux 버전
리눅스는 윈도우와 달리 좀더 간편하게 라이브러리를 빌드하고 사용할 수 할수있습니다.
1. 라이브러리 빌드하기
# 압축 해제 #
unzip cryptopp890.zip -d ./cryptopp890
# 압축 해제 폴더로 이동 #
cd cryptopp890
# 정적 라이브러리, 동적 라이브러리, 테스트파일 빌드 #
# 방법 1 #
make static dynamic cryptest.exe
# 방법 2 #
make libcryptopp.a libcryptopp.so cryptest.exe
# 빌드 확인 #
ls *.so *.a *.exe
2. 라이브러리 사용하기
이제 라이브러리가 준비되었으니 테스트파일을 만들어 테스트 해봅시다.
# cryptopp890 폴더에서 뒤로가기 #
cd ..
# 테스트용 cpp파일 생성 #
vi CryptoTest.cpp
#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;
typedef unsigned char byte;
typedef unsigned long long word64;
#include <base64.h>
using CryptoPP::Base64Encoder;
using CryptoPP::Base64Decoder;
int main()
{
string stringTest = "Ruru TestString";
string encTest, decTest;
/* 인코딩 시작 */
Base64Encoder encoder;
encoder.Put((const byte*)stringTest.data(), stringTest.size());
encoder.MessageEnd();
word64 encSize = encoder.MaxRetrievable();
if (encSize)
{
encTest.resize(encSize);
encoder.Get((byte*)&encTest[0], encTest.size());
}
cout << "Base64 Encode: " << encTest << endl;
/* 디코딩 시작 */
Base64Decoder decoder;
decoder.Put((byte*)encTest.data(), encTest.size());
decoder.MessageEnd();
word64 decSize = decoder.MaxRetrievable();
if (decSize && decSize <= SIZE_MAX)
{
decTest.resize(decSize);
decoder.Get((byte*)&decTest[0], decTest.size());
}
cout << "Base64 Decode: " << decTest << endl;
return 0;
}