로컬에 설치된 Python 모듈 목록을 어떻게 얻을 수 있습니까?
Python 설치 (UNIX 서버)에있는 Python 모듈 목록을 가져오고 싶습니다.
컴퓨터에 설치된 Python 모듈 목록을 어떻게 얻을 수 있습니까?
해결책
pip> 10.0과 함께 사용하지 마십시오!
pip freeze
Python 스크립트에서 유사 목록 을 얻는 데 50 센트 :
import pip
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
for i in installed_packages])
print(installed_packages_list)
(너무 긴) 하나의 라이너로 :
sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
기부:
['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24',
'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3',
'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1',
'werkzeug==0.9.4']
범위
이 솔루션은 시스템 범위 또는 가상 환경 범위에 적용되며 setuptools
, pip
및 ( god forbid )에 의해 설치된 패키지를 다룹니다 easy_install
.
내 사용 사례
이 호출의 결과를 플라스크 서버에 추가 했으므로이를 호출 http://example.com/exampleServer/environment
하면 서버의 virtualenv에 설치된 패키지 목록이 표시됩니다. 디버깅이 훨씬 쉬워집니다.
주의 사항
이 기술의 이상한 동작을 발견했습니다. Python 인터프리터가 setup.py
파일 과 동일한 디렉토리에서 호출 될 때 .NET에서 설치된 패키지를 나열하지 않습니다 setup.py
.
재현 단계 :
가상 환경 만들기$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $
git repo 복제
setup.py
(test_env) $ git clone https://github.com/behave/behave.git
Cloning into 'behave'...
remote: Reusing existing pack: 4350, done.
remote: Total 4350 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done.
Resolving deltas: 100% (2388/2388), done.
Checking connectivity... done.
우리는 다음과 같이 행동 setup.py
했습니다 /tmp/behave
.
(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
git repo에서 python 패키지 설치
(test_env) $ cd /tmp/behave && pip install .
running install
...
Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.egg
Finished processing dependencies for behave==1.2.5a1
앞서 언급 한 솔루션을 실행하면 /tmp
>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp'
앞서 언급 한 솔루션을 실행하면 /tmp/behave
>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp/behave'
behave==1.2.5a1
작업 디렉토리에 behave
의 setup.py
파일이 포함되어 있기 때문에 두 번째 예제에서 누락되었습니다 .
설명서에서이 문제에 대한 참조를 찾을 수 없습니다. 아마도 버그를 열어 보겠습니다.
help('modules')
Python 셸 / 프롬프트에서.
이제이 방법을 직접 시도해 보았고 광고 된 모든 모듈을 정확히 얻었습니다.
아아, 정말 당신은 stdlib에 대해별로 신경 쓰지 않고 파이썬 설치로 얻는 것을 알고 있습니다.
정말 내가 설치 한 물건을 원합니다 .
놀랍게도 실제로 잘 작동 한 것은 다음과 같습니다.
pip freeze
반환 :
Fabric==0.9.3
apache-libcloud==0.4.0
bzr==2.3b4
distribute==0.6.14
docutils==0.7
greenlet==0.3.1
ipython==0.10.1
iterpipes==0.4
libxml2-python==2.6.21
패키지 설치 도구가이 기능을 찾을 수있을 것으로 예상되는 정확한 위치이기 때문에 "놀랍게도"라고 말합니다. '고정'이라는 이름은 아니지만 파이썬 패키징이 너무 이상해서이 도구가 타당하다는 사실에 놀랐습니다. 핍 0.8.2, Python 2.7.
에서
ipython
"import
Tab"를 입력 할 수 있습니다 .표준 Python 인터프리터에서 "
help('modules')
"를 입력 할 수 있습니다 .명령 줄에서 .
pydoc
modules
스크립트에서
pkgutil.iter_modules()
.
pip 버전 1.3부터 다음에 액세스 할 수 있습니다.
pip list
"pip freeze"에 대한 구문 설탕 인 것 같습니다. 버전 번호와 함께 설치 또는 virtualenv와 관련된 모든 모듈이 나열됩니다. 불행히도 모듈의 현재 버전 번호를 표시하지 않으며 설거지하거나 신발을 닦지 않습니다.
현재 사용되는 모듈을보기 위해 이것을 사용합니다.
import sys as s
s.modules.keys()
파이썬에서 실행되는 모든 모듈을 보여줍니다.
모든 내장 모듈에 대해 다음을 사용하십시오.
s.modules
모든 모듈과 가져 오기 개체를 포함하는 dict입니다.
일반 셸에서는
pydoc modules
핍 10부터 허용되는 답변은 더 이상 작동하지 않습니다. 개발 팀이 get_installed_distributions
루틴에 대한 액세스 권한을 제거했습니다 . 에는 setuptools
동일한 작업을 수행 하는 대체 기능이 있습니다 . 다음은 pip 10에서 작동하는 대체 버전입니다.
import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
for i in installed_packages])
print(installed_packages_list)
이전 버전의 pip에서도 작동하는지 여부를 알려주십시오.
Python 셸에 설치된 패키지를 나열해야하는 경우 help
다음과 같은 명령을 사용할 수 있습니다.
>>help('modules package')
나는 일반적으로 pip list
패키지 목록 (버전 포함)을 얻는 데 사용 합니다.
물론 이것은 가상 환경에서도 작동합니다. 가상 환경 (글로벌 패키지 아님)에만 설치된 항목을 표시하려면 pip list --local
.
다음pip list
은 몇 가지 좋은 예와 함께 사용 가능한 모든 옵션을 보여주는 문서 입니다.
pkgutil.iter_modules를 사용한 매우 간단한 검색
from pkgutil import iter_modules
a=iter_modules()
while True:
try: x=a.next()
except: break
if 'searchstr' in x[1]: print x[1]
OS X에서 커스텀 설치된 python 2.7을 만났습니다. 설치된 모듈을 나열하려면 X11이 필요했습니다 (도움말 및 pydoc 사용).
X11을 설치하지 않고 모든 모듈을 나열 할 수 있도록 pydoc을 http-server로 실행했습니다.
pydoc -p 12345
그런 다음 http://localhost:12345/
모든 모듈을 보도록 Safari에 지시 할 수 있습니다.
Windows에서는 cmd에 입력하십시오.
c:\python\libs>python -m pip freeze
이것은 Adam Matan의 답변 (허용되는 답변) 에서 영감을 얻었습니다 .
import tabulate
try:
from pip import get_installed_distributions
except:
from pip._internal.utils.misc import get_installed_distributions
tabpackages = []
for _, package in sorted([('%s %s' % (i.location, i.key), i) for i in get_installed_distributions()]):
tabpackages.append([package.location, package.key, package.version])
print(tabulate.tabulate(tabpackages))
그런 다음 다음 형식으로 표를 인쇄합니다.
19:33 pi@rpi-v3 [iot-wifi-2] ~/python$ python installed_packages.py
------------------------------------------- -------------- ------
/home/pi/.local/lib/python2.7/site-packages enum-compat 0.0.2
/home/pi/.local/lib/python2.7/site-packages enum34 1.1.6
/home/pi/.local/lib/python2.7/site-packages pexpect 4.2.1
/home/pi/.local/lib/python2.7/site-packages ptyprocess 0.5.2
/home/pi/.local/lib/python2.7/site-packages pygatt 3.2.0
/home/pi/.local/lib/python2.7/site-packages pyserial 3.4
/usr/local/lib/python2.7/dist-packages bluepy 1.1.1
/usr/local/lib/python2.7/dist-packages click 6.7
/usr/local/lib/python2.7/dist-packages click-datetime 0.2
/usr/local/lib/python2.7/dist-packages construct 2.8.21
/usr/local/lib/python2.7/dist-packages pyaudio 0.2.11
/usr/local/lib/python2.7/dist-packages tabulate 0.8.2
------------------------------------------- -------------- ------
이렇게하면 .NET Framework를 사용하거나 사용하지 않고 설치 한 패키지를 쉽게 식별 할 수 있습니다 sudo
.
참고 사항 : 한 번은 패킷을 설치 sudo
하지 않고 한 번 설치할 때 다른 패킷 이 나열되지 않도록 한 패킷 이 우선 적용됩니다 (한 위치 만 표시됨). 나는 로컬 디렉토리에 하나만 나열되어 있다고 생각합니다. 이것은 개선 될 수 있습니다.
사용하는 것 외에도 가상 환경에 노른자 를 pip freeze
설치 했습니다.
- 사용 가능한 모든 모듈을 얻으려면
sys.modules
- 설치된 모든 모듈 을 얻으려면 (읽기 : installed by
pip
), 다음을 볼 수 있습니다.pip.get_installed_distributions()
두 번째 목적을 위해 예제 코드 :
import pip
for package in pip.get_installed_distributions():
name = package.project_name # SQLAlchemy, Django, Flask-OAuthlib
key = package.key # sqlalchemy, django, flask-oauthlib
module_name = package._get_metadata("top_level.txt") # sqlalchemy, django, flask_oauthlib
location = package.location # virtualenv lib directory etc.
version = package.version # version number
이 용액에 기초한 기본 모듈이다 importlib
및 pkgutil
CPython의 3.4 및 3.5의 CPython 작업하지만 CPython과 2에 대한 지원이 없다.
설명
sys.builtin_module_names
-모든 내장 모듈의 이름을 지정합니다 ( 여기에서 내 대답을 보십시오 ).pkgutil.iter_modules()
-사용 가능한 모든 모듈에 대한 정보를 반환합니다.importlib.util.find_spec()
-모듈이있는 경우 가져 오기에 대한 정보를 반환합니다.BuiltinImporter
-내장 모듈에 대한 임포터 ( docs )SourceFileLoader
-표준 Python 모듈의 임포터 (기본적으로 * .py 확장자가 있음) ( docs )ExtensionFileLoader
- 공유 라이브러리 로서의 모듈 임포터 (C 또는 C ++로 작성)
전체 코드
import sys
import os
import shutil
import pkgutil
import importlib
import collections
if sys.version_info.major == 2:
raise NotImplementedError('CPython 2 is not supported yet')
def main():
# name this file (module)
this_module_name = os.path.basename(__file__).rsplit('.')[0]
# dict for loaders with their modules
loaders = collections.OrderedDict()
# names`s of build-in modules
for module_name in sys.builtin_module_names:
# find an information about a module by name
module = importlib.util.find_spec(module_name)
# add a key about a loader in the dict, if not exists yet
if module.loader not in loaders:
loaders[module.loader] = []
# add a name and a location about imported module in the dict
loaders[module.loader].append((module.name, module.origin))
# all available non-build-in modules
for module_name in pkgutil.iter_modules():
# ignore this module
if this_module_name == module_name[1]:
continue
# find an information about a module by name
module = importlib.util.find_spec(module_name[1])
# add a key about a loader in the dict, if not exists yet
loader = type(module.loader)
if loader not in loaders:
loaders[loader] = []
# add a name and a location about imported module in the dict
loaders[loader].append((module.name, module.origin))
# pretty print
line = '-' * shutil.get_terminal_size().columns
for loader, modules in loaders.items():
print('{0}\n{1}: {2}\n{0}'.format(line, len(modules), loader))
for module in modules:
print('{0:30} | {1}'.format(module[0], module[1]))
if __name__ == '__main__':
main()
용법
CPython3.5의 경우 (잘림)
$ python3.5 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
30: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast | built-in
_codecs | built-in
_collections | built-in
_functools | built-in
_imp | None
_io | built-in
_locale | built-in
_operator | built-in
_signal | built-in
_sre | built-in
_stat | built-in
_string | built-in
_symtable | built-in
_thread | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
227: <class '_frozen_importlib_external.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__ | /usr/local/lib/python3.5/__future__.py
_bootlocale | /usr/local/lib/python3.5/_bootlocale.py
_collections_abc | /usr/local/lib/python3.5/_collections_abc.py
_compat_pickle | /usr/local/lib/python3.5/_compat_pickle.py
_compression | /usr/local/lib/python3.5/_compression.py
_dummy_thread | /usr/local/lib/python3.5/_dummy_thread.py
_markupbase | /usr/local/lib/python3.5/_markupbase.py
_osx_support | /usr/local/lib/python3.5/_osx_support.py
_pydecimal | /usr/local/lib/python3.5/_pydecimal.py
_pyio | /usr/local/lib/python3.5/_pyio.py
_sitebuiltins | /usr/local/lib/python3.5/_sitebuiltins.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
64: <class '_frozen_importlib_external.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bisect | /usr/local/lib/python3.5/lib-dynload/_bisect.cpython-35m-x86_64-linux-gnu.so
_bz2 | /usr/local/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so
_codecs_cn | /usr/local/lib/python3.5/lib-dynload/_codecs_cn.cpython-35m-x86_64-linux-gnu.so
_codecs_hk | /usr/local/lib/python3.5/lib-dynload/_codecs_hk.cpython-35m-x86_64-linux-gnu.so
_codecs_iso2022 | /usr/local/lib/python3.5/lib-dynload/_codecs_iso2022.cpython-35m-x86_64-linux-gnu.so
(****************************truncated*******************************)
CPython3.4의 경우 (잘림)
$ python3.4 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
54: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast | built-in
_bisect | built-in
_codecs | built-in
_collections | built-in
_datetime | built-in
_elementtree | built-in
_functools | built-in
_heapq | built-in
_imp | None
_io | built-in
_locale | built-in
_md5 | built-in
_operator | built-in
_pickle | built-in
_posixsubprocess | built-in
_random | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
246: <class '_frozen_importlib.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__ | /usr/lib/python3.4/__future__.py
_bootlocale | /usr/lib/python3.4/_bootlocale.py
_collections_abc | /usr/lib/python3.4/_collections_abc.py
_compat_pickle | /usr/lib/python3.4/_compat_pickle.py
_dummy_thread | /usr/lib/python3.4/_dummy_thread.py
_markupbase | /usr/lib/python3.4/_markupbase.py
_osx_support | /usr/lib/python3.4/_osx_support.py
_pyio | /usr/lib/python3.4/_pyio.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
44: <class '_frozen_importlib.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bz2 | /usr/lib/python3.4/lib-dynload/_bz2.cpython-34m-x86_64-linux-gnu.so
_codecs_cn | /usr/lib/python3.4/lib-dynload/_codecs_cn.cpython-34m-x86_64-linux-gnu.so
_codecs_hk | /usr/lib/python3.4/lib-dynload/_codecs_hk.cpython-34m-x86_64-linux-gnu.so
_codecs_iso2022 | /usr/lib/python3.4/lib-dynload/_codecs_iso2022.cpython-34m-x86_64-linux-gnu.so
_codecs_jp | /usr/lib/python3.4/lib-dynload/_codecs_jp.cpython-34m-x86_64-linux-gnu.so
_codecs_kr | /usr/lib/python3.4/lib-dynload/_codecs_kr.cpython-34m-x86_64-linux-gnu.so
_codecs_tw | /usr/lib/python3.4/lib-dynload/_codecs_tw.cpython-34m-x86_64-linux-gnu.so
_crypt | /usr/lib/python3.4/lib-dynload/_crypt.cpython-34m-x86_64-linux-gnu.so
(****************************truncated*******************************)
경우에 당신은이 아나콘다 파이썬 분포가 설치, 당신은 또한 사용할 수 있습니다
$conda list
위에서 설명한 솔루션 외에도.
pip freeze 는 모든 패키지 찾기를 수행하지만 다음 명령을 작성하여 파이썬 패키지가있는 모든 경로를 나열 할 수 있습니다.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
이것을 시도하십시오
pip list
또는
pip freeze
많은 아이디어가 있습니다. 처음에는이 두 가지를 숙고하고 있습니다.
씨
단점 : 항상 설치되는 것은 아닙니다.
help ( '모듈')
단점 : 콘솔로 출력; 깨진 모듈로 (우분투 참조 ...) segfault 수 있습니다.
기본 라이브러리를 사용하고 이전 Python 2.x와 호환되는 쉬운 접근 방식이 필요합니다.
그리고 나는 빛을 본다 : listmodules.py
2.5의 문서 소스 디렉토리에 숨겨진 것은 Python 설치에 사용 가능한 모든 모듈을 나열하는 작은 스크립트입니다.
장점 :
imp, sys, os, re, time 만 사용합니다.
Python 1.5.2 이상에서 실행되도록 설계
소스 코드가 매우 간결하므로 버그가있는 모듈의 예외 목록을 전달하는 등 쉽게 수정할 수 있습니다 (가져 오기를 시도하지 마십시오).
고양이 피부를 만드는 방법에는 여러 가지가 있습니다.
가장 간단한 방법은
pydoc
다음과 같이 쉘에서 직접 함수 를 사용하는 것입니다.
pydoc modules
그러나 자세한 내용 은 설치 날짜를 알려주 는 pip-date 라는 도구를 사용하십시오 .
pip install pip-date
AWS Lambda에서 기본적으로 사용할 수있는 특정 버전의 패키지를 찾아야했습니다. 이 페이지에서 아이디어를 매시업하여 그렇게했습니다. 후손을 위해 공유하고 있습니다.
import pkgutil
__version__ = '0.1.1'
def get_ver(name):
try:
return str(__import__(name).__version__)
except:
return None
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': [{
'path': m.module_finder.path,
'name': m.name,
'version': get_ver(m.name),
} for m in list(pkgutil.iter_modules())
#if m.module_finder.path == "/var/runtime" # Uncomment this if you only care about a certain path
],
}
내가 발견 한 것은 제공된 boto3 라이브러리가 오래되었고 내 코드가 실패한 것은 내 잘못이 아니라는 것입니다. 프로젝트에 boto3와 botocore를 추가하기 만하면되었습니다. 그러나 이것이 없었다면 나는 내 코드가 나쁘다고 생각했을 것입니다.
{
"statusCode": 200,
"body": [
{
"path": "/var/task",
"name": "lambda_function",
"version": "0.1.1"
},
{
"path": "/var/runtime",
"name": "bootstrap",
"version": null
},
{
"path": "/var/runtime",
"name": "boto3",
"version": "1.9.42"
},
{
"path": "/var/runtime",
"name": "botocore",
"version": "1.12.42"
},
{
"path": "/var/runtime",
"name": "dateutil",
"version": "2.7.5"
},
{
"path": "/var/runtime",
"name": "docutils",
"version": "0.14"
},
{
"path": "/var/runtime",
"name": "jmespath",
"version": "0.9.3"
},
{
"path": "/var/runtime",
"name": "lambda_runtime_client",
"version": null
},
{
"path": "/var/runtime",
"name": "lambda_runtime_exception",
"version": null
},
{
"path": "/var/runtime",
"name": "lambda_runtime_marshaller",
"version": null
},
{
"path": "/var/runtime",
"name": "s3transfer",
"version": "0.1.13"
},
{
"path": "/var/runtime",
"name": "six",
"version": "1.11.0"
},
{
"path": "/var/runtime",
"name": "test_bootstrap",
"version": null
},
{
"path": "/var/runtime",
"name": "test_lambda_runtime_client",
"version": null
},
{
"path": "/var/runtime",
"name": "test_lambda_runtime_marshaller",
"version": null
},
{
"path": "/var/runtime",
"name": "urllib3",
"version": "1.24.1"
},
{
"path": "/var/lang/lib/python3.7",
"name": "__future__",
"version": null
},
...
제가 발견 한 내용은 공식적으로 발표 한 내용과 도 달랐습니다 . 이 글을 쓰는 시점 :
- 운영 체제 – Amazon Linux
- AMI – amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
- Linux 커널 – 4.14.77-70.59.amzn1.x86_64
- JavaScript 용 AWS SDK – 2.290.0 \
- Python 용 SDK (Boto 3) – 3-1.7.74 botocore-1.10.74
pip list
Python 프로그램에서 호출하는 방법을 궁금해하는 사람 은 다음을 사용할 수 있습니다.
import pip
pip.main(['list]) # this will print all the packages
이것은 도움이 될 것입니다
터미널 또는 IPython에서 다음을 입력합니다.
help('modules')
그때
In [1]: import #import press-TAB
Display all 631 possibilities? (y or n)
ANSI audiodev markupbase
AptUrl audioop markupsafe
ArgImagePlugin avahi marshal
BaseHTTPServer axi math
Bastion base64 md5
BdfFontFile bdb mhlib
BmpImagePlugin binascii mimetools
BufrStubImagePlugin binhex mimetypes
CDDB bisect mimify
CDROM bonobo mmap
CGIHTTPServer brlapi mmkeys
Canvas bsddb modulefinder
CommandNotFound butterfly multifile
ConfigParser bz2 multiprocessing
ContainerIO cPickle musicbrainz2
Cookie cProfile mutagen
Crypto cStringIO mutex
CurImagePlugin cairo mx
DLFCN calendar netrc
DcxImagePlugin cdrom new
Dialog cgi nis
DiscID cgitb nntplib
DistUpgrade checkbox ntpath
껍질에서
ls site-packages
도움이되지 않으면 이렇게 할 수 있습니다.
import sys
import os
for p in sys.path:
print os.listdir( p )
그리고 그것이 무엇을 생산하는지보십시오.
참고 URL : https://stackoverflow.com/questions/739993/how-can-i-get-a-list-of-locally-installed-python-modules
'program story' 카테고리의 다른 글
숫자가 정밀도를 잃지 않고 갈 수있는 JavaScript의 가장 높은 정수 값은 무엇입니까? (0) | 2020.09.28 |
---|---|
HTML5 숫자 입력의 스핀 상자를 숨길 수 있습니까? (0) | 2020.09.28 |
OpenID와 OAuth의 차이점은 무엇입니까? (0) | 2020.09.28 |
JOIN과 INNER JOIN의 차이점 (0) | 2020.09.28 |
Wi-Fi를 통해 Android 애플리케이션을 실행 / 설치 / 디버그 하시겠습니까? (0) | 2020.09.28 |