'Language'에 해당하는 글 98건

인터넷에서 파일을 다운로드 받을 때, 파일이름이 URL decode 되지 않은채로 다운로드되는 경우가 있다

파일 사용 자체에는 문제 없지만, 파일이름을 알아보기 힘들다는 문제점이 있다

그런 파일들이 많을 때는 더 문제다


그래서 특정 디렉토리 내의 파일들의 이름을 url-decode하는 코드를 작성해봤다.

실행에는 python3가 필요하다



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
"""
Filename : urldecode.py
Python version : 3
Usage example : python urldecode.py C:\\my_dir
"""
import os
import argparse
from pathlib import Path
from urllib.parse import unquote
 
parser = argparse.ArgumentParser(description='특정 디렉토리의 url-encoded 파일이름들을 decode하는 프로그램')
parser.add_argument('dirpath', type=str, help='url-encoded 파일들이 위치한 디렉토리 경로')
args = parser.parse_args()
 
dirpath = Path(args.dirpath)
 
filenames = [x for x in dirpath.iterdir() if x.is_file()]
for x in filenames:
    print(x)
yn = input('rename all? (Y/n) : ').lower()
if yn != 'y':
    exit(0)
 
for old in filenames:
    new = Path(unquote(old.name))
    if new == old:
        continue
 
    print('Renamed {old} -> {new}'.format(old=old, new=new))
    old.rename(new)
 
cs



'Language > python' 카테고리의 다른 글

[python] BeautifulSoup4 vs Scrapy  (0) 2018.05.01
[python] map object  (0) 2018.04.26
[python] for문과 yield문, return문  (0) 2018.04.24
[python] elasticsearch-dsl scan / index / doc_type  (0) 2018.04.12
[python] logging handler class 소개  (0) 2018.04.12

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

직역하면 추상적인 공장

공장은 Object를 생성하는 공장이고

추상적인 공장이라 함은 생성하는 Object가 추상화되어 있다는 것이다


책에 있는대로 Object는 Maze를 예로 들겠다


Abstract Factory는 시스템에게, EnhancedMaze를 생성하는 factory인지, BoomMaze를 생성하는 factory인지에 대하여 추상화 되어있다
시스템(Client라고도 할 수 있다)은 어떤 Maze가 생성되는 지 모른다


그저 Factory를 통해서 어떤 Maze 생성을 수행한다

이것이 추상화의 의미


--- 효과 ---


Abstract Factory를 사용하면 Object와 시스템의 의존성을 제거함으로서 재사용성을 높일 수 있다

EnhancedMaze를 사용하는 System이 이미 있을 때, 이 시스템을 재사용하여 BoomMaze를 사용하는 System을 손쉽게 구현할 수 있다는 것이다


Clean Code에서는(197p) Abstract Factory를 이용하여 Application이 object 생성 시점을 결정(lazy initialization와 같은)하되, Object를 생성하는 코드는 애플리케이션(앞에서 시스템이라고 언급했던)이 모르게 한다고 되어있다




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

let arr = ['a','b','c']


for (let i in arr) console.log(i);

이 때 i는 index가 된다

즉, in은 Array의 index를 가져오도록 한다


for (let i of arr) console.log(i);

이 때 i는 element(value)가 된다

즉, of는 Array의 element를 가져오도록 한다



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

beautifulsoup4은 파싱 라이브러리

scrapy는 크롤링 프레임워크


beautifulsoup4(bs4)에는 request 부분이 포함되어 있지 않다

하지만 scrapy는 포함되어 있고, 동시에 여러 개의 요청을 보낸다, 즉 별도구현없이 빠르다는 차이점이 있다



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

map object 생성방법은 아래와 같다


map(type, iterable)


어디에 사용할 수 있느냐? 하나의 라인에 여러 개의 int value를 입력받을 때 사용할 수 있다


a,b,c = map(int, input().split(' '))

# input example: 1 2 3


map 또한 iterable 타입으로서, next() 함수를 통해 순회할 수 있다




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def func():
    for i in range(10):
        yield i
    return 'exit'
 
for i in func():
    print(i)
 
''' output
0
1
2
...
9
'''
 
cs



마지막 return문의 'exit'는 출력되지 않는다



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

<블로그 주인장의 말>

프로젝트를 진행하고 시간이 지난 후, 프로젝트를 재개하거나 다시 살펴봐야 할 일이 생겼을 때.

그 프로젝트를 다시 보려면 큰 각오가 필요하고 엄두가 안난다면?

이 책을 한번 읽어보자. 내가 코드를 클린하게 짜고 있는지.


---


코드는 요구사항의 상세한 표현이다


<클린코드의 4가지 원칙?>

중복을 피하라

한 기능만 수행하라

제대로 표현해라

작게 추상화해라


<우리는 저자다>
Javadoc에는 @author 필드가 있다

코드 작성을 글 작성처럼 이야기하는 듯 하다 (의도를 표현하는 글)


<좋은 코드를 작성하는 것은 오래 걸린다?>

80년대 에디터는 입력한 모든 커맨드를 기억했다. 그것을 재생시켜보면 실제로 코딩시간의 90%는 화면을 스크롤하고, 코드를 읽는 시간이었다고 한다

좋은 코드는 읽기 쉽다. 잘 안 읽히는 코드는, 코드 작성을 어렵게 만든다


변수/클래스는 명사구

함수/메서드는 동사구


<함수는 짧게>

함수길이는 최소한 한 화면에 들어와야 한다고 생각하고 있었지만,

이 책에서는 심지어 함수가 2~4줄 정도로 작아야 의도를 잘 표현한다고 이야기한다


함수의 최대 들여쓰기는 2단 이하를 추천한다

블록을 함수로 분리함으로써 2단 이하로 줄이는 것이다


함수 내 모든 라인의 추상화 레벨은 동일하게


SRP: Single Responsibility Principle

 - 가지 책임만 가져야 한다

OCP:Open Closed Principle

 - 변경에 닫혀있어야 한다 (new employee type이 추가될 때마다 case문을 추가해야한다)


앞부분에 Abstract Factory 패턴이 자주 나온다


<서술적인 이름 사용>

함수 이름이 길어도 괜찮다.

짧고 어려운 이름보다, 길고 서술적인 주석보다 좋다.


발음하기 쉬운 이름 사용


<파라메터>

파라메터 3개 이상은 피하자

특별한 이유가 없다면


많은 파라메터는 테스트도 어렵게 만든다


아웃풋 파라메터는 더 어렵다. 피하자


플래그 파라메터도 피하자

함수가 플래그에 따라 두가지 일을 한다고 대놓고 공표하는 셈이니까!

ex) render(True)


new Point(0,0)의 파라메터

이것은 한 값을 표현하는 두 요소이다. 두 요소에는 자연적인 순서도 있다


assertEquals(expected, actual)

이 함수는 2항을 피할수는 없지만, 항 사이 순서가 없다. 헷갈린다!


<오류코드 리턴보다는 예외 처리를 사용하라>

if문으로 에러코드를 리턴하면, caller는 에러코드를 "즉시" 처리해야 한다는 문제에 부딪힌다

하지만 try/catch문을 사용하면, 에러 처리 코드를 분리할 수 있다


또 하지만, 저자는 try/catch문이 코드 구조에 혼란을 일으키며 정상동작/에러처리 코드를 뒤섞어놓는다고 한다 (이해는 잘 안되지만)

그러므로 try, catch 블록 각각을 함수화 시켜야 한다고 이야기한다


좀더 추가설명을 하자면, 에러처리도 "한 작업"이므로 분리해야 한다는 것이다


<주석보다는 코드로 의도를 표현하라>

저자는 최대한 주석을 줄이라고 이야기한다

심지어 주석은 실패를 의미한다고 한다. 코드로 의도를 표현하는 데에 실패했다는 것이다



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

elasticsearch-dsl에는 Search class가 있다


Search class는 scan() API가 있다


이것은 elasticsearch-py.helpers.scan() API의 wrapper로서, 

이것은 elasticsearch search의 scroll API의 wrapper이다


이 scan() API를 사용하려는데, 아래 코드는 에러가 발생했다


우선 Post라는 DocType 클래스를 정의한 후이다


Post.search().scan()


--------------


This feature is experimental and may be subject to change.


위에서 작성하던 DocType.search()이라는 API는, experimental function이라고 한다

그런 이유에서 필자는 원치않는 동작을 체험하였기 때문에

DocType.search() 대신 Search() class를 사용하는 것을 추천한다


2018.04.12.




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

StreamHandler


그냥 쓰면 된다


기본적인 핸들러 사용법은 아래


log = logging.getLogger('nl-api') # get logger log.setLevel(logging.DEBUG) # set level to logger fmt = logging.Formatter(logging.BASIC_FORMAT) # create formatter ch = logging.StreamHandler() # create handler
ch.setFormatter(fmt) # set formatter to handler
ch.setLevel(logging.DEBUG) # set level to handler
log.addHandler(ch) # add handler to logger


RotatingFileHandler


파일핸들러를 사용해도 되지만, 오랫동안/많이 로그를 남기면 파일 사이즈가 커질 수 있다

이 핸들러와 파일핸들러의 차이점은, 기준 크기 이상이 되면 rollover하여 새로운 파일에 로깅한다는 것이다

option은 filename과 maxBytes, backupCount이다

maxBytes는 로그파일 하나의 기준 크기이고, backupCount는 로그파일의 갯수이다

maxBytes * backupCount 용량 이상의 로그가 쌓일경우, 오래된 것부터 삭제된다


maxBytes는 원하는 로그파일당 사이즈를 주면 되겠고

backupCount는 여유있게 주면 되겠다 (문제없는한 충분히)


FileHandler보다는 advanced하다




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/



class logging.Logger
propagate

If this attribute evaluates to true, events logged to this logger will be passed to the handlers of higher level (ancestor) loggers, in addition to any handlers attached to this logger. Messages are passed directly to the ancestor loggers’ handlers - neither the level nor filters of the ancestor loggers in question are considered.

If this evaluates to false, logging messages are not passed to the handlers of ancestor loggers.

The constructor sets this attribute to True.


Logger의 propagate의 default value는 True이다


propagate=True이면, higher level logger's handlers에게 logging이 passing된다


level이나, handler에 대한 처리순서는 다음과 같다


log = logging.getLogger('test')


log.debug('hello')



1. log에서 처리 (log.level이 debug보다 높을경우 종료, 즉 handler도 패스되지 않음)

2. log's handlers에서 처리 (각 handlers의 level에 따라 처리)

3. log's ancestors's handlers (마찬가지로 각 handlers의 level의 따라 처리) (ancestors logger는 거치지않음)


logger들은 입구이고, handler들은 출구이다


---


logger의 level이 NOTSET일 경우에는, 아무 로그도 처리하지 않는다

handler의 level이 NOTSET일 경우에는, 모든 로그를 처리한다



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

위 에러는 아래와 같은 경우에 발생한다


def func(**kwargs): pass


func(param='temp1', param='temp2')


param이라는 keyword argument를 여러 개(multiple) 보냈을 때 발생한다




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

DocType.save()

return value

 - True: the document was created

 - False: the document was overwritten


if save fails -> raise exception



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

unicode string을 의미하는 prefix로서, python2의 syntax이다 (python3에서는 굳이 붙이지 않아도 된다)


https://stackoverflow.com/a/2464968




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

패키지의 모듈 뿐만아니라 내부 패키지도 모두 import 해준다는 차이점이 있다 (바닐라 파이썬 인터프리터는 안됨)


import urllib


urllib.parse # python에서는 에러, ipython에서는 가능



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

DocType 클래스를 정의했다면 (이름은 Post이라고 가정)


Post.init()으로 mapping을 populate시킬 수 있다


그리고 그 mapping을 dict 또는 string으로 얻고싶다면 아래와 같다


Post._doc_type.mapping.to_dict()


---


init()에서 에러가 발생한다면 (text to keyword conflict)

reindex 해야하므로 참고하자



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

http://enjoytools.net/xe/board_PZRP31/7961


OSError: raw write() returned invalid length 112 (should have been between 0 
and 56)

아래 라인을 추가하면 된다고 한다

100% 확신은 아니지만, 아래 코드 추가 후 에러가 발생하지 않았다


import win_unicode_console 

win_unicode_console.enable()


필자의 파이썬 버전은 3.5.4이다



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

python에는 여러가지 SQL ORM이 있다


필자가 자주 본 것은 Django's ORM, SQLAlchemy(flask에서 사용하는)


이번에 SQLAlchemy를 간단하게 사용하므로 기록해놓으려 한다


https://www.pythoncentral.io/overview-sqlalchemys-expression-language-orm-queries/


declarative_base(), 

Column, String, Integer, 

create_engine('sqlite:///')


가장 기초적으로는 이러한 것들만 있으면 된다

'sqlite:///' 는 in-memory db이다


여기서 궁금했던 것은, 두가지


String vs VARCHAR? -> length 제한이 없다면 String으로 사용하자 (https://stackoverflow.com/a/41136521)


sqlite URL?

absolute path: sqlite:///C:\\Users\\...\\data\\db.db

relative path: sqlite:///data/db.db


db 파일이 없을경우, 새로 생성된다


----------


http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#common-filter-operators


1. create_engine()으로 DB를 만든다

2. sessionmaker()로 Session class을 생성하고, configure하고, Session instance를 생성한다

3. Session.query(<Table class>).first() -> 첫번째 row를 가져온다




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

얼마전 프로젝트를 할 때 엘리스틱서치를 사용하기 위해서

라이브러리 수준의 코드를 만들었었기 때문에, 나의 코드와 라이브러리의 코드를 비교해보고 싶어서 코드를 읽어보게 되었다


https://github.com/elastic/elasticsearch-dsl-py/blob/master/elasticsearch_dsl/search.py


우선 search.py 파일 Search 클래스의 filter부터 봤다


filter 메서드는 query 메서드의 wrapper처럼 동작한다


그리고 query 메서드는, 실제로는 메서드가 아니라 ProxyDescriptor라는 오브젝트이다


그리고 실제로 query문은 query.py Q 펑션에 의해 세팅된다 (ProxyDescriptor.__set__()에서 볼수있듯이)


Q는 Query


 - 추가 예정 -



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

https://stackoverflow.com/a/49632135


pycharm에서 ipython 6.3.0을 지원 못해서 발생한 문제.


6.2.1로 다운그레이드 해주면 된다


pip install 'ipython<6.3'




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

pyreadline은 readline의 python implementation이다 (아래 링크 인용)

http://pythonhosted.org/pyreadline/introduction.html#a-python-implementation-of-gnu-readline




(readline의 기능 및 example code)

https://ko.wikipedia.org/wiki/GNU_readline




예제 코드를 컴파일 하기전에 readline 라이브러리 설치 필요


sudo apt-get install libreadline-dev


https://stackoverflow.com/questions/23085076/readline-readline-h-file-not-found




WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

open(), read(), write()


Low-level File I/O API이다


fopen(), fread(), fwrite()


High-level File I/O API이다


무슨 차이일까?


---


fopen() 계열 API들은 buffer를 통해 I/O를 한다


I/O는 딜레이가 매우 큰 작업이므로, buffer를 활용하여 CPU 리소스 효율성을 높일 수 있기 때문이다


그러면 open()을 사용할 필요가 있을까?


---


linux에서 device file에 access할 경우, fopen()을 사용할 수 없다는 듯 하다


이럴 때에는 open()이 필요하다



'Language' 카테고리의 다른 글

[Javascript] for문 종류 (of vs in)  (0) 2018.05.01
Clean Code 독서 & 메모  (0) 2018.04.22
[Java] anonymous subclass (Thread)  (0) 2018.03.15
[Visual Studio 2017] scc display information error  (0) 2018.03.06
[Javascript] vue-cli example  (0) 2018.01.06

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

windows scrapy 실행 중 발생


아래 패키지를 설치하면 된다


pip install pywin32


(win32api가 아니라 pywin32 설치하면 됨)



'Language > python' 카테고리의 다른 글

[python] pycharm interpreter console error  (0) 2018.04.06
[python] pyreadline 패키지  (0) 2018.04.06
[python] Poweshell virtualenv activate error 해결방법  (0) 2018.04.03
[python] pip install whl file  (0) 2018.04.03
[python] SQLAlchemy  (0) 2018.04.03

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

cmd가 아닌 powershell이라면 activate.bat이 아니라 activate.ps1를 실행해야 한다

근데 에러가 발생한다


<Scripts\activate.ps1 실행결과>


.\activate.ps1 : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\Users\20170218\Desktop\temp\naver_stock\venv\Scripts\ac

tivate.ps1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=13

5170)를 참조하십시오.

위치 줄:1 문자:1

+ .\activate.ps1

+ ~~~~~~~~~~~~~~

    + CategoryInfo          : 보안 오류: (:) [], PSSecurityException

    + FullyQualifiedErrorId : UnauthorizedAccess




솔루션은 아래와 같다


https://stackoverflow.com/a/18713789


Poweshell 관리자 모드로 실행 후, 아래 커맨드를 실행한다


Set-ExecutionPolicy Unrestricted


아래 커맨드로 설정값을 확인해볼 수 있다


Get-ExecutionPolicy


다시 activate.ps1을 실행하면 virtualenv가 잘 실행됨을 확인할 수 있다


문제는 해결되지만, powershell 보안정책을 꺼둔 것이므로, 그건 알아두도록 하자


----


에러가 UnauthorizedAccess니까, authorize를 하면 되지 않을까 라는 생각도 들지만, 다음에 알아보자


'Language > python' 카테고리의 다른 글

[python] pyreadline 패키지  (0) 2018.04.06
[python] ImportError: No module named 'win32api'  (1) 2018.04.03
[python] pip install whl file  (0) 2018.04.03
[python] SQLAlchemy  (0) 2018.04.03
[python] yield, generator, coroutine  (0) 2018.03.30

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

pip install <whl file path>



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

Python ORM(Object Relational Mapper) library



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

아래 내용에는 필자가 잘못 이해하여 틀린 내용이 있을수도 있다.


https://mingrammer.com/translation-iterators-vs-generators/


yield가 뭐지?


python에서 yield문을 포함하는 함수는, 리턴값이 generator이다

generator는 iterator의 한 종류이다 (위 링크의 글 인용)


그리고 generator를 리턴하는 함수를 coroutine이라고 한다

코루틴이란, 함수의 일부만을 수행하고 suspend되는 함수이다

suspend되는 위치는 yield문까지이다


yield문을 통해 함수를 coroutine으로 만들 수 있다

coroutine을 왜 만들지?




coroutine의 장점?


함수를 coroutine으로 만들면, yield문의 위치에서의 동작을 함수 외부에 맡길 수 있다

callback 파라미터를 넘기는 것과의 차이는, 함수가 suspend된다는 점이다

(결국 suspend되기 때문에 임의 동작이 가능한 것이지만)


coroutine은, 함수를 일부분씩 실행할 수 있다는 장점이 있다



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
def func():
    for i in range(10):
        print('func', i)
        yield i # yield and return i
 
def main():
    result = []
 
    for i in func():
        result.append(i)
 
    for i in result:
        print('result', i)
 
    
 
if __name__ == '__main__':
    main()
 
'''
# output
func 0
func 1
func 2
func 3
func 4
func 5
func 6
func 7
func 8
func 9
result 0
result 1
result 2
result 3
result 4
result 5
result 6
result 7
result 8
result 9
'''
 
cs


event = (yield) 문과 같이 함수 외부로부터 값을 받을수도 있다

이건 알아만 두자


'Language > python' 카테고리의 다른 글

[python] pip install whl file  (0) 2018.04.03
[python] SQLAlchemy  (0) 2018.04.03
[python] elasticsearch-py max_tries  (0) 2018.03.30
[python] 유용한 scrapy command  (0) 2018.03.29
[python] scrapy concurrent_requests  (0) 2018.03.27

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

Elasticsearch(max_tries=0)


max_tries parameter -> kwargs -> Transport class



'Language > python' 카테고리의 다른 글

[python] SQLAlchemy  (0) 2018.04.03
[python] yield, generator, coroutine  (0) 2018.03.30
[python] 유용한 scrapy command  (0) 2018.03.29
[python] scrapy concurrent_requests  (0) 2018.03.27
[python] win32api ImportError  (0) 2018.03.26

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

scrapy startproject <project-name>

프로젝트 생성


scrapy crawl <spider-name>

스파이더 실행


scrapy shell <url>

scrapy object들(request/response/crawler/spider)을 interpreter에서 다뤄볼 수 있다

xpath도 테스트 해볼수 있다


https://doc.scrapy.org/en/latest/topics/shell.html#configuring-the-shell


shell 커맨드 사용시, ipython이 설치되어 있다면 ipython이 실행될 것이다


scrapy view <url>

JS 등이 실행되기 전, 즉 크롤러에서 받게되는 html 문서를 확인가능



'Language > python' 카테고리의 다른 글

[python] yield, generator, coroutine  (0) 2018.03.30
[python] elasticsearch-py max_tries  (0) 2018.03.30
[python] scrapy concurrent_requests  (0) 2018.03.27
[python] win32api ImportError  (0) 2018.03.26
[python] windows pip Twisted install error  (0) 2018.03.23

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

scrapy는 동시에 여러 request를 보낸다


settings.py에서 CONCURRENT_REQUESTS 값을 통해 그 최대치를 조절할 수 있다

기본값은 16개이다


scrapy는 Twisted를 기반으로 한다

Twisted의 description은 아래와 같다

python-written Event-driven Network Programming Framework, which is single-thread


single-thread이지만 async로 동작하므로 (node.js처럼) 한번에 하나의 request만 전송하지 않는 것이다



'Language > python' 카테고리의 다른 글

[python] elasticsearch-py max_tries  (0) 2018.03.30
[python] 유용한 scrapy command  (0) 2018.03.29
[python] win32api ImportError  (0) 2018.03.26
[python] windows pip Twisted install error  (0) 2018.03.23
[python] scrapy with form-data  (0) 2018.03.23

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

https://stackoverflow.com/a/35948588


pip install pypiwin32



'Language > python' 카테고리의 다른 글

[python] 유용한 scrapy command  (0) 2018.03.29
[python] scrapy concurrent_requests  (0) 2018.03.27
[python] windows pip Twisted install error  (0) 2018.03.23
[python] scrapy with form-data  (0) 2018.03.23
python scrapy 한글 인코딩  (0) 2018.03.16

WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/

사용중인 블로그 스킨이 방명록을 지원하지 않습니다.

초대장을 받고싶으신 분들은 댓글 또는 블로그 설명의 메일로.