반응형

출처 : https://stackoverflow.com/questions/5537876/get-utc-offset-from-time-zone-name-in-python

Python에서 시간대(timezone) 이름으로 UTC 시차(offset) 구하기

Python에서 시간대(timezone) 이름으로 UTC 시차(offset)을 어떻게 구합니까?

예시: 저는 Asia/Jerusalem을 통해 +0200을 얻고 싶습니다.


미국동부시간으로 한국 시간 구하기 예시

import datetime
import pytz

est = datetime.datetime.now(pytz.timezone('America/New_York'))
diff_min = (est.utcoffset().seconds - 86400) // 60 - 540
# ...중략...
# 02:38:00 28.02.20
svr_time = datetime.datetime.strptime(svr_str, "%H:%M:%S %d.%m.%y") - datetime.timedelta(minutes=diff_min)

3개의 답변 중 2개의 답변만 추려냄

pytz 프로젝트와 utcoffset 메소드 사용을 시도하신 적 있으신가요?

예시

>>> import datetime
>>> import pytz
>>> pacific_now = datetime.datetime.now(pytz.timezone('US/Pacific'))
>>> pacific_now.utcoffset().total_seconds()/60/60
-7.0

DST(일광절약시간, 서머타임) 때문에 결과는 그 해의 시간에 따라 다릅니다.

import datetime, pytz

datetime.datetime.now(pytz.timezone('Asia/Jerusalem')).strftime('%z')

# returns '+0300' ('now' 지금은 DST(일광절약시간, 서머타임)이기 때문입니다)

pytz.timezone('Asia/Jerusalem').localize(datetime.datetime(2011,1,1)).strftime('%z')

# returns '+0200' (1월에는 DST(일광절약시간, 서머타임)이 아니기 때문입니다)
반응형
반응형

출처 :https://stackoverflow.com/questions/12523044/how-can-i-tail-a-log-file-in-python

Python에서 로그 파일 tail 하는 방법?

저는 blocking이나 locking 없이 Python에서 tail -F 또는 뭔가 비슷한 방법으로 출력을 하고 싶습니다. 저는 여기에서 이를 할 수 있는 오래된 코드를 찾았지만 같은 것을 할 수 있는 라이브러리나 더 좋은 방법이 있을거라 생각합니다.

저는 더 많은 데이터를 원할때마다 호출할 수 있는 tail.getNewData()처럼 뭔가 있으면 합니다.

12개의 답변 중 1개의 답변만 추려냄

Non Blocking

리눅스에 있다면 (윈도우가 파일에서 select 호출을 지원하지 않기 때문에) select 모듈과 함께 서브 프로세스 모듈을 사용할 수 있습니다.

import time 
import subprocess 
import select 

f = subprocess.Popen(['tail','-F',filename],\ 
        stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
p = select.poll() 
p.register(f.stdout) 
while True: 
    if p.poll(1): 
        print f.stdout.readline() 
    time.sleep(1)

이는 새로운 데이터를 위한 출력 pipe를 poll하고 가능할 때 print 합니다. 일반적으로 time.sleep(1)print f.stdout.readline() 은 유용한 코드로 대체될 수 있습니다.

Blocking

추가적은 select 모듈 호출 없이 subprocess 모듈을 사용할 수 있습니다.

import subprocess
f = subprocess.Popen(['tail','-F',filename],\
        stdout=subprocess.PIPE,stderr=subprocess.PIPE)
while True:
    line = f.stdout.readline()
    print line

이는 추가될 때 새로운 line이 출력될 것이지만, tail program이 f.kill에 의해 닫힐 때까지 blocking 될 것입니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/5574702/how-to-print-to-stderr-in-python

Python에서 표준에러로 출력하는 방법?

표준 출력으로 쓰는 몇가지 방법이 있습니다.

# Note: 첫번째 문장은 Python 3에서 실행되지 않습니다.
print >> sys.stderr, "spam"

sys.stderr.write("spam\n")

os.write(2, b"spam\n")

from __future__ import print_function
print("spam", file=sys.stderr)

그것은 파이썬의 선 #13†과 모순되는 것처럼 보입니다. 그래서 여기의 차이점은 무엇이며 어떤 방법을 사용하던 장단점이 있습니까? 어떤 방법을 사용해야 합니까?

† 문제를 해결할 하나의 - 바람직하고 유일한 - 명백한 방법이 있을 것이다.

15개의 답변 중 1개의 답변만 추려냄

저는 짧고 유연하고 이식하기 좋고 읽기 좋은 유일한 방법을 찾았습니다.

from __future__ import print_function
import sys

def eprint(*args, **kwargs):
    print(*args, file=sys.stderr, **kwargs)

함수 eprint는 표준 print 함수와 같은 방법으로 사용될 수 있습니다.

>>> print("Test")
Test
>>> eprint("Test")
Test
>>> eprint("foo", "bar", "baz", sep="---")
foo---bar---baz
반응형
반응형

출처 : https://stackoverflow.com/questions/29523954/distinguishing-between-two-quickfix-initiator-sessions

2개의 QuickFix initiator 세션을 구분하기

저는 broker로 접속하기 위한 Python binding으로 QuickFix를 사용하고 있고 config 파일에서 2 개의 initiator 세션이 있습니다. 하나는 가격을 위한 것이고 다른 것은 주문 세션을 위한 것입니다.

제 질문은 그들 중 하나만 온라인일 때 뭔가를 하고 싶습니다.

initiator = fix.SocketInitiator(application, storeFactory, settings, logFactory)
if initiator.isLoggedOn():
    function()

가격이나 주문 세션이나 로그인 된 둘 다에 관련하여 function이 호출될 것입니다. 저는 특정 initiator가 로그인되어 있을 때 알아낼 수 있을까요?


1개의 답변 중 1개의 답변

언급하신대로, 메소드 bool Initiator::isLoggedOn()는 어떤 세션이든 현재 로그인 되었는지 당신에게 알려줍니다.

특별한 세션을 확인하기 위해 bool Initiator::isConnected( const SessionID& sessionID )를 사용하세요.

SocketInitiatorInitiator로 부터 이들 둘 다를 상속합니다.

반응형
반응형

어떻게 접속이 끊어졌을 때 자동으로 재접속할 수 있나요?

issue 414를 보세요.


재접속을 위한 공통 패턴

pgrandinetti님 질문

몇 개의 제 프로젝트에서 접속 오류나 재접속 시도가 발생할 수 있는 시나리오를 다루기 위해 다음처럼 진행합니다.

async def listen_forever(self):
        while True:
        # 접속을 실패할 때마다 밖의 루프는 재실행됨
            try:
                async with websockets.connect(self.url) as ws:
                    while True:
                    # listener loop
                        try:
                            reply = await asyncio.wait_for(ws.recv(), timeout=***)
                        except (asyncio.TimeoutError, websockets.exceptions.ConnectionClosed):
                            try:
                                pong = await ws.ping()
                                await asyncio.wait_for(pong, timeout=self.ping_timeout)
                                logger.debug('Ping OK, keeping connection alive...')
                                continue
                            except:
                                await asyncio.sleep(self.sleep_time)
                                break  # 안쪽 loop
                        # dreply 객체로 작업을 진행합니다.
            except socket.gaierror:
                # 뭔가 로그를 남깁니다.
                continue
            except ConnectionRefusedError:
                # 뭔가 다른 것을 로그로 남깁니다.
                continue

저는 (1)이것이 괜찮은지 궁금하고요. (2) websockets에 이미 반복적인 행위같은 것을 처리하기 위해 제공되는 지름길 같은 방법이 있는지도 궁금합니다. (맞다고 가정합니다!)

aaugustin님 답변

이를 구현한 웹소켓에서 지름길 같은 방법은 없습니다.

이 사용 사례에 관해 이전에 들었고 저는 유효하다고 갱각합니다.

저는 좋은 API를 제공할 수 있을 지 확실하지는 않습니다. -- 저는 사용자 코드가 접속할 때 혹은 접속이 끊어졌을 때 이 작업(재접속)을 해야될 것으로 예상되지만 어떻게 이를 처리해야할지는 확실하지 않습니다.

heckad님 질문

이 특징을 추가하기 위해 필요한 것은 무멋이 있을까요?

aaugustin님 추가 제안

이 특징을 위해 저는 다음을 제안합니다.

  • 첫째, 이 특징이 정확히 반응하는지 묘사하는 문서가 필요합니다.
  • 우리가 그것에 동의하면 테스트와 함께 구현하겠습니다.

pgrandinetti 님 답변

@heckad 저는 최소한의 재생산 가능한 예시를 여기에 작성하였습니다.
https://gist.github.com/pgrandinetti/964747a9f2464e576b8c6725da12c1eb

반응형
반응형

출처

request.GET에서 URL 파라미터를 얻기

저는 URL에서 파라미터를 얻기 위해 튜토리얼에 설명된대로 정규식을 정의하고 있습니다. HttpRequest 객체의 일부분으로 URL로부터 파라미터에 접근할 수 있을까요?

HttpRequest.GET은 현재 비어있는 QueryDict 객체를 리턴합니다.

저는 라이브러리 없이 이를 할 수 있는 방법을 배워 Django를 더 잘 알고 싶습니다.

10개의 답변 중 1개의 답변

URL이 다음과 같습니다. domain/search/?q=haha, 이렇다면 당신은 request.GET.get('q','')를 사용할 수 있습니다.

q는 당신이 원하는 파라미터이며, ''는 q가 없을 때 기본(default) 값입니다.

하지만, URLconf**에 설정된 것이라면, regex로부터 당신이 얻은 것은 함수의 인자(또는 named argument)로 전달될 것입니다.

만약 다음 URLconf 코드라면

(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),

views.py에서 다음 함수가 있을 것입니다.

def profile_page(request, username):
    # 메소드의 나머지 부분
반응형
반응형

출처

Python 튜플 리스트 그룹핑

(라벨, 개수) 튜플의 리스트가 다음처럼 있습니다.

[('grape', 100), ('grape', 3), ('apple', 15), ('apple', 10), ('apple', 4), ('banana', 3)]

이로부터 저는 같은 라벨(같은 라벨은 항상 연속됨)로 모든 개수값들을 합계를 내고 같은 라벨 순서로 리스트를 리턴하고 싶습니다.

[('grape', 103), ('apple', 29), ('banana', 3)]

저는 다음처럼 뭔가 해결은 할 수 있었습니다

def group(l):
    result = []
    if l:
        this_label = l[0][0]
        this_count = 0
        for label, count in l:
            if label != this_label:
                result.append((this_label, this_count))
                this_label = label
                this_count = 0
            this_count += count
        result.append((this_label, this_count))
    return result

하지만, 이것보다 더 Pythonic 하고 / 우아하고 / 효율적인 방법이 있을까요?


7개의 답변 중 2개의 답변만 추려냄

itertools.groupby 는 당신이 원하는 것을 할 수 있습니다.

import itertools
import operator

L = [('grape', 100), ('grape', 3), ('apple', 15), ('apple', 10),
     ('apple', 4), ('banana', 3)]

def accumulate(l):
    it = itertools.groupby(l, operator.itemgetter(0))
    for key, subiter in it:
       yield key, sum(item[1] for item in subiter) 

print(list(accumulate(L)))
# [('grape', 103), ('apple', 29), ('banana', 3)]

댓글

  • lambda 대신에 operator.itemgetter를 사용하는 것이 좋습니다. – jathanism Feb 12 '10 at 1:48

  • 이 방법은 첫번째 키로 정렬된 리스트가 필요합니다. 이미 정렬이 되지 않았다면, ghostdog74 님의 접근이 훨씬 좋은 해결책입니다. – Martijn Pieters♦ Oct 10 '16 at 21:05


ghostdog74 님의 답변

import collections
d=collections.defaultdict(int)
a=[]
alist=[('grape', 100), ('banana', 3), ('apple', 10), ('apple', 4), ('grape', 3), ('apple', 15)]
for fruit,number in alist:
    if not fruit in a: a.append(fruit)
    d[fruit]+=number
for f in a:
    print (f,d[f])

결과

$ ./python.py
('grape', 103)
('banana', 3)
('apple', 29)
반응형
반응형

출처 : https://stackoverflow.com/questions/32234156/how-to-unimport-a-python-module-which-is-already-imported

이미 import된 python 모듈을 unimport 하는 방법?

저는 NumPy/SciPy에 매우 신입입니다. 요즘 Matlab을 사용하는 대신에 숫자 계산을 위해 매우 활발하게 그것을 사용하기 시작하였습니다.

간단한 계산을 위해 스크립트를 작성하는 것보다 interactive 모드에서 이를 실행합니다. 이러한 경우 이미 import한 모듈을 unimport하는 방법이 있을까요? unimport는 제가 파이썬 프로그램을 작성할 때는 필요 없겠지만, interactive 모듈에서는 필요합니다.

4개의 답변 중 1개의 답변

당신이 import한 것을 unload 하는 방법은 없습니다. 파이썬은 cache에 모듈의 복사본을 유지하기 때문에 다음에 reload와 다시 초기화하지 않고 그것을 (그대로) import합니다.

만약 당신이 필요한 게 그것으로 접근하지 않도록 하려면 del을 사용할 수 있습니다.

import package
del package

그런 다음 패키지를 다시 import하면 모듈의 캐시된 복사본이 사용됩니다.

다시 가져올 때 코드를 다시 실행할 수 있도록 모듈의 캐시된 복사본을 무효화하려면 @DeepSOIC의 답변에 따라 대신 sys.modules.pop을 사용할 수 있습니다.

당신이 패키지를 변경했고 갱신된 내용을 보고 싶다면, 당신은 그것을 reload 할 수 있습니다. 이는 몇가지 경우 작동하지 않을 수 있는데 import된 패키지가 그것에 의존적인 패키지를 reload할 필요가 있을 때입니다. 이것에 의존적인 것 이전에 관련된 문서를 읽어봐야 합니다.

Python 버전 2.7까지는 build-in 함수인 reload 를 사용합니다.

reload(package)

Python 3.0부터 3.3까지는 당신은 imp.reload 를 사용할 수 있습니다.

import imp
imp.reload(package)

Python 3.4 이상이라면 당신은 importlib.reload 를 사용할 수 있습니다.

import importlib
importlib.reload(package)
반응형
반응형

출처
https://stackoverflow.com/questions/49684495/is-it-possible-to-set-environment-variables-in-googles-colaboratory

Google Colaboratory에서 환경 변수를 설정하는 것이 가능합니까?

저는 Google Colaboratory 플랫폼에서 파이썬 스크립트를 실행하고 있습니다. 이제, 저는 다음처럼 시스템의 환경 변수를 세팅하야 합니다.

!export PATH=drive/app/tf-models-fork/research;drive/app/tf-models-fork/research/object_detection;drive/app/tf-models-fork/research/slim;$PATH

I tried to add the location to the variable PATH. However, I am getting the following errors:
저는 PATH 변수를 추가하는 것을 시도했습니다. 하지만 다음과 같은 오류가 발생하였습니다.

/bin/sh: 1: drive/app/tf-models-fork/research/object_detection: Permission denied
/bin/sh: 1: drive/app/tf-models-fork/research/slim: Permission denied
/bin/sh: 1: drive/app/tf-models-fork/research: Permission denied

이 플랫폼에서 환경 변수를 설정할 수 있는 방법이 있을까요?


2개의 답변 중 1개의 답변만 추려냄

저는 os.environ으로 PATH를 다음처럼 설정합니다.

import os
os.environ['PATH'] += ":/usr/local/go/bin"
반응형
반응형

출처
https://stackoverflow.com/questions/375427/non-blocking-read-on-a-subprocess-pipe-in-python

python에서 subprocess.PIPE로 non-blocking 읽기

저는 subprocess를 시작하기 위해 을 출력 스트림(표준출력)으로 접속하기 위해 subprocess 모듈을 사용하고 있습니다. 저는 그 출력을 non-blocking으로 읽도록 실행하고 싶습니다. .readline을 non-blocking으로 만들거나 .readline를 실행하기 전에 스트림에 데이터가 있는지 검사하는 방법이 있습니까? 저는 이를 Windows나 Linux에서 최소한의 작업으로 이식하고 싶습니다.
여기는 현재 제가 한 방법입니다. (데이터가 없을 때 .readline는 blocking됩니다.)

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()

29개의 답변 중 1개의 답변만 추려냄

fcntl, select, asyncproc는 이 경우 도움이 되지 않을 것입니다.
운영체제에 관계없이 blocking 없이 스트림을 읽는 신뢰성 있는 방법은 Queue.get_nowait()를 사용하는 것입니다.

import sys
from subprocess import PIPE, Popen
from threading  import Thread

try:
    from queue import Queue, Empty
except ImportError:
    from Queue import Queue, Empty  # python 2.x

ON_POSIX = 'posix' in sys.builtin_module_names

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # 쓰레드가 프로그램과 함께 죽습니다.
t.start()

# ... 여기서 다른 것을 합니다

# blocking 없이 한 줄을 읽습니다.
try:  line = q.get_nowait() # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else: # 한 줄을 얻었습니다.
    # ... 그 한 줄로 뭔가를 합니다.
반응형

+ Recent posts