반응형

출처

is_displayed() element 메소드 - 셀레니움 파이썬

셀레니움의 파이썬 모듈은 파이썬의 자동화된 테스트를 수행하기 위해 만들어졌습니다. 셀레니움 파이썬은 기능/승인 테스트를 작성하는 간단한 API를 제공합니다.셀레니움 파이썬을 사용하여 웹페이지를 열려면 - 다음 get 메소드를 사용하여 링크 탐색하기을 확인하세요. 해당 주소로 갈 수 있다는 것만으로는 그다지 유용하지 않습니다. 우리가 정말 원하는 것은 페이지 또는 더 구체적으로 페이지의 HTML element와 상호작용하는 것 입니다. 셀레니움에서 사용하는 element를 찾는 다양한 전략이 있습니다. 다음 찾는 전략을 확인하세요. 이 글은 셀리니움에서 is_displayed 메소드를 사용하는 방법에 대해 설명합니다.is_replayed 메소드는 element가 사용자에게 보이는지 아닌지 확인하는 데 사용됩니다. 이는 불리언 값 True 또는 False가 리턴됩니다.

문법

element.is_displayed()

예시

<a href="https://www.geeksforgeeks.org/" id="link" />Text Here</a>

element를 찾기 위해 찾는 전략의 하나를 사용할 필요가 있습니다. 예를 들어,

element = driver.find_element_by_id("link")
element = driver.find_element_by_xpath("//a[@id='link']")

여러개의 element를 찾기 위해 우리는 다음을 사용할 수 있습니다.

elements = driver.find_elements_by_id("link")

이제 이 element가 표시되는지 확인할 수 있습니다.

text_length = element.is_displayed()

셀레니움 파이썬에서 is_displayed element 메소드를 사용하는 방법?

셀레니움 파이썬에서 이 메소드를 표현하기 위해 https://www.geeksforgeeks.org/ 를 사용합시다. geeksforgeeks에서 navigation bar에 course tab을 볼 수 있는지 확인합니다.

프로그램

# import webdriver
from selenium import webdriver

# create webdriver object
driver = webdriver.Firefox()

# get geeksforgeeks.org
driver.get("https://www.geeksforgeeks.org/")

# get element
element = driver.find_element_by_link_text("Courses")

# print value
print(element.is_displayed())

** 출력**

(venv) [naveen@naveen articles]$ python run.py
True
(venv) [naveen@naveen articles]$
반응형
반응형

출처
https://stackoverflow.com/questions/59371973/quickfix-python-plugin-use-case-for-testing-segmentation-fault-error

QuickFix 파이썬 플러그인 - 테스트 케이스 용도 - segmentation fault 오류

우리는 Fix 서버로부터 메세지를 주고 받기 위해 QuickFix를 사용하는 곳에서 테스트 자동화 프레임워크 (PyTest+Quickfix)를 만들었습니다. 우리가 (임의의 양으로) 많은 양의 데이터를 보낼 때 우리는 Segmentation fault 오류가 발생하였습니다. 일부의 작은 양의 테스트 케이스는 잘 작동하였습니다. QuickFix의 내부 상태가 잘못된 거라 생각합니다. (유지하는 실제 세션에 대해 알고 있음)

다음은 코드의 일부분입니다.

class MyFixApp(quickfix.Application):
    class State(Enum):
        NONE = 0
        LOGGED_IN = 1
        LOGGED_OUT = 2

    def __init__(self, config_file, timeout_seconds=1):
        super().__init__()
        self.out_messages_queue = queue.Queue()  # blocking queue of quickfix outbound messages
        self.in_messages_queue = queue.Queue()  # blocking queue of quickfix inbound messages
        self.all_messages_list = list()  # list of all quickfix messages
        self.parser = simplefix.FixParser()
        self.settings = quickfix.SessionSettings(config_file)
        self.storeFactory = quickfix.FileStoreFactory(self.settings)
        self.logFactory = quickfix.FileLogFactory(self.settings)
        self.timeout_seconds = timeout_seconds
        self.sessionID = None  # This is just a stateless collection of sender comp, target comp, etc...
        self.state = FixApp.State.NONE
        # initiate the socket last, because this may call into the
        # callbacks below and we need all the members constructed
        self.initiator = quickfix.SocketInitiator(self, self.storeFactory, self.settings, self.logFactory)

    def wait_for_next_in(self, timeout=1):
        return self.in_messages_queue.get(block=True, timeout=timeout)

    def wait_for_next_in_matching(self, subset, skipped=None, timeout=None):
        if timeout is None:
            timeout = self.timeout_seconds
        msg = self.wait_for_next_in(timeout=timeout)
        matches = FixApp.message_contains(msg, subset)
        if matches:
            return msg
        assert skipped is not None, f"expected={subset} msg={msg}"
        skipped.append(msg)
        return self.wait_for_next_in_matching(subset=subset, skipped=skipped, timeout=timeout)

    def login(self, timeout=30):
        print(f"Logging in {threading.get_ident()}")
        self.initiator.start()
        FixApp.wait_until(lambda: self.state is FixApp.State.LOGGED_IN, timeout)
        time.sleep(self.timeout_seconds)
        print(f"Logged in")

    # 30 seconds is needed for removing the session from QuickFix
    def logout(self, timeout=30):
        if not self.sessionID:
            print(f"Logging out without session")
            return
        print(f"Logging out from {self.sessionID} {threading.get_ident()}")
        self.initiator.getSession(self.sessionID).disconnect()
        FixApp.wait_until(lambda: self.state is FixApp.State.LOGGED_OUT, timeout)
        time.sleep(self.timeout_seconds)  # somehow, this needs more time. Remove this, and the following stop fails
        print(f"Logged out")
        self.initiator.stop()
        FixApp.wait_until(lambda: self.initiator.isStopped(), timeout)
        print(f"Initiator stopped")

    @staticmethod
    def wait_until(condition, timeout_sec):
        start = time.time()
        while not condition() and (time.time() - start) < timeout_sec:
            time.sleep(0.1)
        assert condition(), condition()

Stack trace:

#0  0x00007ffff7665e5b in raise () from /lib64/libpthread.so.0
#1  <signal handler called>
#2  0x00007fffee803d14 in FIX::Initiator::connect() () at C++/Initiator.cpp:139
#3  0x00007fffee7fce74 in FIX::SocketInitiator::onStart (this=0x555556a3c5d0) at C++/SocketInitiator.cpp:89
#4  0x00007fffee801cee in FIX::Initiator::startThread (p=<optimized out>) at C++/Initiator.cpp:292
#5  0x00007ffff765b594 in start_thread () from /lib64/libpthread.so.0
#6  0x00007ffff6bf400f in clone () from /lib64/libc.so.6

파이썬에서는 이 라인이 실패합니다. (줄 번호가 첨부된 코드와 일치하지 않습니다.)

Thread 0x00007ffff7fde540 (most recent call first):
  line 187 in wait_until
  line 153 in login

다음은 일치하는 라인입니다.

FixApp.wait_until(lambda: self.state is FixApp.State.LOGGED_IN, timeout)

2개의 답변 중 1개의 답변

해결 방법을 수행했습니다. 세션을 중지(stop)하는 부분을 변경했습니다. self.initiator.stop(True) + 결국 모든 세션 및 로그 파일을 제거했습니다. 이 중 하나만 하면 작동하지 않습니다.

반응형
반응형

출처

https://stackoverflow.com/questions/20180543/how-to-check-the-version-of-python-modules

파이썬 모듈의 버전 확인하는 방법

저는 다음처럼 파이썬 모듈을 설치하였습니다. construct, statlibsetuptools 입니다.

# 다음처럼 다운로드 가능하기 위한 setuptools 설치
sudo apt-get install python-setuptools

# 가벼운 통계 도구를 위한 statlib 설치
sudo easy_install statlib

# 바이너리 데이터를 packing/unpacking하기 위한 construct 설치
sudo easy_install construct

저는 그들의 버전을 검사하기 위해 (프로그래밍으로) 가능한지 알고 싶습니다. 명령어로부터 제가 실행할 수 있는 python --version과 같은 것이 있을까요?


31 개의 답변 중 1 개의 답변

저는 easy install 대신에 pip를 사용하는 것을 제안합니다. pip로 당신은 모든 설치된 패키지를 알 수 있고 버전은 다음 명령으로 알 수 있습니다.

pip freeze

리눅스 시스템 대부분에서, 당신은 관심있는 특정 패키지를 행 단위로 찾기 위해 grep으로 (또는 윈도우즈에서는 findstr으로) 파이프를 사용할 수 있습니다.

Linux:

pip freeze | grep lxml

lxml==2.3

Windows:

pip freeze | findstr lxml

lxml==2.3

개별 모듈에서, 당신은 __version__ 속성 을 시도할 수 있습니다. 하지만, 그것이 없는 모듈도 있습니다.

python -c "import requests; print(requests.__version__)"
2.14.2

python -c "import lxml; print(lxml.__version__)"

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'module' object has no attribute 'version'

마지막으로 질문의 명령에 sudo 접두사가 붙기 때문에 전역 Python 환경에 설치하는 것으로 보입니다. 예를 들어 virtualenvwrapper와 같은 Python 가상 환경 관리자를 살펴보는 것이 좋습니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/31166594/socket-python-recvfrom

소켓 파이썬 : recvfrom

저는 파이썬의 socket.recvfrom이 blocking 함수인지 알고 싶습니다. 그렇지 않다면 문서에서 답변을 찾을 수 없었습니다. 수신 받은 게 없다면 무엇이 리턴되나요? 빈 문자열 '' 인가요? 다른 경우, 사실 blocking이라면 이를 unblocking 함수로 어떻게 변경할 수 있나요? 저는 settimeout에 관해 들었지만 이것이 올바른 해결책인지는 모르겠습니다.

1개의 답변

기본적으로 그것은 blocking입니다. socket.setblocking(0) 또는 (같은 의미인) socket.settimeout(0)을 통해 non-blocking으로 바뀔 수 있습니다. 이 경우 받은 패킷이 없다면 socket.error 예외가 발생합니다.
다음 문서를 확인하세요.

https://docs.python.org/ko/3/library/socket.html#socket.socket.setblocking

반응형
반응형

출처 : https://stackoverflow.com/questions/24157767/how-to-logout-fix-session

fix 세션을 로그아웃하는 방법?

저는 quickfixj를 사용하고 있습니다. 저는 "EndTrade" 같은 사용자 정의 메세지가 있고 그 메세지를 받을 때 fix session을 종료하고 싶습니다? 어떻게 할 수 있을까요? 저는 그것을 할 수 있는 방법을 찾을 수 없었습니다. new Session().logout()을 사용하는 것은 안 됩니다.


1개의 답변

제 질문의 답변을 얻었습니다. 당신은 다음 방법으로 fix session을 로그아웃 할 수 있습니다.

Session.lookupSession(sessionID).logout();
반응형
반응형

출처

https://stackoverflow.com/questions/12385179/how-to-send-a-multipart-form-data-with-requests-in-python

파이썬에서 요청과 함께 "multipart/form-data"를 보내는 방법은 무엇입니까?

파이썬에서 요청과 함께 multipart/form-data를 보내는 방법은 무엇입니까? 파일을 보내는 방법은 알겠는데 이 방법으로 폼(form) 데이터를 보내는 방법을 모르겠습니다.


12 개의 답변 중 1 개의 답변

기본적으로 files 매개변수(dictionary)를 지정하면 요청은 application/x-www-form-urlencoded POST 대신 multipart/form-data POST를 보냅니다. 그러나 해당 dictionary에서 실제 파일을 사용하는 것으로 제한되지는 않습니다.

>>> import requests
>>> response = requests.post('http://httpbin.org/post', files=dict(foo='bar'))
>>> response.status_code
200

httpbin.org는 게시한 헤더를 알려줍니다. response.json()에는 다음이 있습니다.

>>> from pprint import pprint
>>> pprint(response.json()['headers'])
{'Accept': '*/*',
 'Accept-Encoding': 'gzip, deflate',
 'Connection': 'close',
 'Content-Length': '141',
 'Content-Type': 'multipart/form-data; '
                 'boundary=c7cbfdd911b4e720f1dd8f479c50bc7f',
 'Host': 'httpbin.org',
 'User-Agent': 'python-requests/2.21.0'}

더 나은 방법은 단일 문자열 또는 바이트열 개체 대신 튜플을 사용하여 각 부분에 대한 파일 이름, 콘텐츠 유형 및 추가 헤더를 추가로 제어할 수 있다는 것입니다. 튜플은 2~4개의 요소를 포함할 것으로 예상됩니다. 파일 이름, 콘텐츠, 선택적으로 콘텐츠 유형 및 추가 헤더의 선택적 사전입니다.

파일 이름으로 None이 있는 튜플 형식을 사용하여 해당 부분에 대한 요청에서 filename="..." 매개변수를 삭제합니다.

>>> files = {'foo': 'bar'}
>>> print(requests.Request('POST', 'http://httpbin.org/post', files=files).prepare().body.decode('utf8'))
--bb3f05a247b43eede27a124ef8b968c5
Content-Disposition: form-data; name="foo"; filename="foo"

bar
--bb3f05a247b43eede27a124ef8b968c5--
>>> files = {'foo': (None, 'bar')}
>>> print(requests.Request('POST', 'http://httpbin.org/post', files=files).prepare().body.decode('utf8'))
--d5ca8c90a869c5ae31f70fa3ddb23c76
Content-Disposition: form-data; name="foo"

bar
--d5ca8c90a869c5ae31f70fa3ddb23c76--

files는 순서 지정 및/또는 동일한 이름의 여러 필드가 필요한 경우 값이 2개인 튜플의 목록일 수도 있습니다.

requests.post(
    'http://requestb.in/xucj9exu',
    files=(
        ('foo', (None, 'bar')),
        ('foo', (None, 'baz')),
        ('spam', (None, 'eggs')),
    )
)

filesdata를 모두 지정하는 경우 POST 본문을 만드는 데 사용할 데이터 에 따라 다릅니다. data가 문자열인 경우에만 사용됩니다. 그렇지 않으면 datafiles이 모두 사용되며 data의 요소가 먼저 나열됩니다.

고급 멀티파트 지원을 포함하는 우수한 requests-toolbelt 프로젝트도 있습니다. files 매개변수와 동일한 형식으로 필드 정의를 사용하지만 requests와 달리 기본적으로 파일 이름 매개변수를 설정하지 않습니다. 또한 requests가 먼저 메모리에 요청 본문을 구성하는 열린 파일 개체에서 요청을 스트리밍할 수 있습니다.

from requests_toolbelt.multipart.encoder import MultipartEncoder

mp_encoder = MultipartEncoder(
    fields={
        'foo': 'bar',
        # plain file object, no filename or mime type produces a
        # Content-Disposition header with just the part name
        'spam': ('spam.txt', open('spam.txt', 'rb'), 'text/plain'),
    }
)
r = requests.post(
    'http://httpbin.org/post',
    data=mp_encoder,  # The MultipartEncoder is posted as data, don't use files=...!
    # The MultipartEncoder provides the content-type header with the boundary:
    headers={'Content-Type': mp_encoder.content_type}

필드는 동일한 규칙을 따릅니다. 파일 이름, 부분 MIME 유형 또는 추가 헤더를 추가하려면 2~4개 요소가 있는 튜플을 사용하십시오. files 매개변수와 달리 튜플을 사용하지 않는 경우 기본 filename 값을 찾으려고 시도하지 않습니다.

반응형
반응형

출처

https://stackoverflow.com/questions/44882063/replace-all-values-with-nan-in-the-dataframe-in-pandas

pandas의 데이터프레임에서 NaN으로 모든 값 대체하기

다음과 같은 작은 데이터프레임(df)이 있습니다.

unique  a     b     c     d 
  0    None  None  None  None
  1    None  None  None  None
  2    None  0132  None  None
  3    None  None  None  0231
  4    None  None  None  None
  5    None  None  0143  None
  6    0121  None  None  None
  7    None  None  None  0432

저는 모든 값을 NaN으로 대체해야 합니다. 저는 df.fillna(np.NAN)의 적용을 시도해 보았지만, 셀에서 숫자가 있는 곳의 값이 변하지 않았습니다. 어떻게 모든 값이 교체되도록 할 수 있을까요? 데이터프레임은 다음처럼 보여야 합니다.

unique  a     b     c     d 
  0    NaN   NaN   NaN   NaN
  1    NaN   NaN   NaN   NaN
  2    NaN   NaN   NaN   NaN
  3    NaN   NaN   NaN   NaN
  4    NaN   NaN   NaN   NaN
  5    NaN   NaN   NaN   NaN
  6    NaN   NaN   NaN   NaN
  7    NaN   NaN   NaN   NaN

3 개의 답변 중 1 개의 답변

np.nan을 대입하기 위해 loc를 사용합니다.

df.loc[:] = np.nan

iloc도 잘 작동합니다.

df.iloc[:] = np.nan
반응형
반응형

출처

https://stackoverflow.com/questions/3743222/how-do-i-convert-a-datetime-to-date

datetime을 date로 변환하는 방법?

어떻게 Python에서 datetime.datetime 객체(예 datetime.datetime.now() 의 리턴 값)를 datetime.date 객체로 변환할 수 있을까요?


8 개의 답변 중 1 개의 답변

date() 메소드를 사용하세요.

datetime.datetime.now().date()
반응형
반응형

출처

https://stackoverflow.com/questions/20198274/how-do-i-clear-cache-with-python-requests

Python Requests로 캐시를 지우려면 어떻게 하나요?

기본으로 파이썬의 requests 패키지는 데이터를 캐시 하나요?

예를 들어

import requests
resp = requests.get('https://some website')

이 응답은 캐시됩니까? 그렇다면 어떻게 지우나요?


5 개의 답변 중 2 개의 답변

'Cache-Control: no-cache' 헤더를 추가합니다.

self.request = requests.get('http://google.com',
                            headers={'Cache-Control': 'no-cache'})

완벽한 답변은 아래 글을 확인하세요.


답변이 늦었지만 python requests요청을 캐시하지 않으므로 대신 Cache-ControlPragma 헤더를 사용해야 합니다.

import requests
h = {
    ...
    "Cache-Control": "no-cache",
    "Pragma": "no-cache"
}
r = requests.get("url", headers=h)
...

HTTP/Headers

Cache-Control
Cache-Control 일반 헤더 필드는 요청과 응답 모두에서 캐싱 메커니즘에 대한 지시문을 지정하는 데 사용됩니다. 캐싱 지시문은 단방향입니다. 즉, 요청에 지정된 지시문이 응답에 동일한 지시문이 제공되어야 함을 의미하지 않습니다.

Pragma
요청-응답 체인을 따라 다양한 영향을 미칠 수 있는 구현별 헤더입니다. Cache-Control 헤더가 아직 존재하지 않는 HTTP/1.0 캐시와의 하위 호환성을 위해 사용됩니다.

지시자

no-cache
캐시된 복사본을 응답(배포)하기 전에 유효성 검사를 위해 원본 서버에 요청을 제출하도록 캐시를 (사용하지 않도록) 강제합니다.

Pragma에 대한 참고 사항:

Pragma는 HTTP 응답에 대해 지정되지 않았으므로 Cache-Control 헤더 필드가 생략된 경우 Cache-Control: no-cache와 동일하게 동작하지만 일반 HTTP/1.1 Cache-Control 헤더를 신뢰할 수 있는 대체품이 아닙니다. 요청. HTTP/1.0 클라이언트와의 역호환성을 위해서만 Pragma를 사용하십시오.

반응형
반응형

참고주소 : https://stackoverflow.com/questions/6473679/transpose-list-of-lists

리스트의 리스트를 transpose(전치행렬)

다음과 같은 행렬이 있습니다.

l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

제가 찾고 있는 결과는 다음과 같습니다.

r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

다음 결과는 아닙니다.

r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

매우 감사합니다.

13개 답변 중 1개

Python 3 :

# 테이블(행렬)이 들쭉날쭉한 경우 가장 짧은 내부 리스트 개수만큼 단락:
list(map(list, zip(*l)))

# 들쭉날쭉한 경우 데이터를 버리지 않고 내부 리스트를 None으로 채웁니다
list(map(list, itertools.zip_longest(*l, fillvalue=None)))

Python 2 :

map(list, zip(*l))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

설명:

진행 상황을 이해하기 위해 알아야 할 두 가지 사항이 있습니다.

  1. zip의 시그너쳐: zip(*iterables) 이것은 zip이 각각 반복 가능한 임의의 개수의 인수를 예상한다는 것을 의미합니다. 예를 들어 zip([1, 2], [3, 4], [5, 6]).
  2. unpack 된 인수 목록: 인수 args의 시퀀스가 주어지면 f(*args)args의 각 요소가 f의 개별 위치 인수가 되도록 f를 호출합니다.
  3. itertools.zip_longest는 내부 리스트의 요소 수가 동일하지 않은 경우(동종) 데이터를 버리지 않고 대신 더 짧은 중첩 목록을 채운 다음 zip 처리를 합니다.

질문 l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]의 입력으로 돌아가면 zip(*l)zip([1, 2, 3], [4, 5, 6], [7, 8, 9])와 같습니다. 나머지는 결과가 튜플의 리스트 대신 리스트의 리스트인지 확인하는 것입니다.

반응형

+ Recent posts