web-dev-qa-db-ja.com

コード内にpythonモジュールをインストールする

私は自分のスクリプト内でPyPiから直接パッケージをインストールする必要があります。たぶんモジュールやdistutilsdistributepipなど)機能があるので、pypi.install('requests')のようなものを実行することができ、リクエストは私のvirtualenvにインストールされます。

218
chuwy

次のようなものも使えます。

import pip

def install(package):
    if hasattr(pip, 'main'):
        pip.main(['install', package])
    else:
        pip._internal.main(['install', package])

# Example
if __== '__main__':
    install('argh')
336
Rikard Anglerud

Rickardのソリューションは、pip開発チームによってサポートされていないため、場合によってはクラッシュします(マルチスレッドなど)。さらに、pip 10以降、コードがpip._internalに移動され、これがサポートされていないことが明確になりました。したがって、この解決策は「pip> = 10.0.0」のインポートエラーで失敗します。

Quantumの解決策はこの問題を解決するための好ましい方法ですが、彼の実装はそれが正しいpipを呼び出すことを保証するものではありません。

このソリューションは、コードを実行しているpythonインタプリタのpipを呼び出すことを保証します。

import subprocess
import sys

def install(package):
    subprocess.call([sys.executable, "-m", "pip", "install", package])

Quantumのソリューションと同じですが、直接pipを実行する代わりに、コードを実行しているのと同じpython実行可能ファイルを実行し、インストールしたpipモジュールを実行するように指示し、残りの引数を渡します。

103
Aaron de Windt

pipを使用して必要なパッケージをインストールし、インストール後にそれをインポートする場合は、次のコードを使用できます。

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)


install_and_import('transliterate')

ユーザーとしてパッケージをインストールした場合は、パッケージをインポートできないという問題が発生する可能性があります。追加情報については、 sys.pathの更新方法? を参照してください。

67
rominf

これはうまくいくはずです。

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])
17
quantum

"install_requires"オプションを使ってあなた自身のパッケージのsetup.pyの中に依存モジュールを定義します。

パッケージにコンソールスクリプトを生成する必要がある場合は、「bin」フォルダ(virtualenv環境など)に配置されるラッパースクリプトを生成するために「console_scripts」エントリポイントを使用できます。

7
Andreas Jung

この質問がまだ有効であることを願っています。私は上記のようなことをしました:

    import sys
    import os
    import site 

    try:
       import pip
    except ImportError:
       print "installing pip"
       cmd = "Sudo easy_install pip"
       os.system(cmd)
       reload(site)

    try: 
       import requests
    except ImportError:
       print "no lib requests"
       import pip
       cmd = "Sudo pip install requests"
       print "Requests package is missing\nPlease enter root password to install required package"
       os.system(cmd)
       reload(site)

2番目のtryブロックは最初のtryブロックのelse部分にも書くことができますが、私の問題ステートメントでは2つの別々のブロックを書かなければなりません。

3
Umesh Kaushik

これがi 私のプロジェクトのすべてのパッケージをインストールする方法です

メインコードを実行する前に リストにすべての名前を追加して oneを実行する.

"venv"を使ってこれを組み合わせるのは素晴らしいことです!

"""call this module to setup your python packages via pip"""

from pip._internal import main as pip

pip_install_argument = "install"

# packages to install
packages_to_install = [
        "numpy",        # math magic 1
        "scipy",        # math magic 2
        ]

def install(packages):
    """installes given packages via pip

    Args:
        package names as list

    Returns:
        None

    """
    global pip_install_argument
    for package in packages:
        pip([pip_install_argument, package])

if __== '__main__':
    install(packages_to_install)
2
Felix Quehl

私たちは私たちのマシンにピップがあって、欠けている特定の依存関係を捉えようとしていると思います。

import os
try: 
    import something
    .....
    .....
except ImportError as e:
    pip = lambda : os.system('pip install' + str(e)[15:])
    pip()

また、pip関数を使用して「自己認識」インポーターメカニズムを適用する場合は、lambdaモジュール自体の使用を検討してください。このコードスニペットに従ってください:)

try:
    import somthing
    ..........
    ..........
except ImportError as e:
    # importing pip module to handle pip functionalites
    import pip
    # create a lambda that import using pip by module_error_name=e[15:]
    installer = lambda : pip.main(['install', str(e)[15:])
    # create a lambda that import a module by linear_lambda_call
    importer = lambda x : __import__(str(x)).import_module()
    # install the module
    installer()
    # import the module
    importer()
1
SysMurff

私にとってはこれはうまくいきます(python 2.x)。すべての要件がrequirements.txtの中で定義されていると仮定します。

def pip_auto_install():
    """
    Automatically installs all requirements if pip is installed.
    """
    try:
        from pip._internal import main as pip_main
        pip_main(['install', '-r', 'requirements.txt'])
    except ImportError:
        print("Failed to import pip. Please ensure that pip is installed.")
        print("For further instructions see "
              "https://pip.pypa.io/en/stable/installing/")
        sys.exit(-1)
    except Exception as err:
        print("Failed to install pip requirements: " + err.message)
        sys.exit(-1)


pip_auto_install()
1
siom

モジュールをインポートするos端末をエミュレートするためにos.systemを使用します。その場合は、他のすべてのスクリプトでモジュールを使用できます。

たとえば、私は別々に追加されたスクリプトを一緒に追加して実行するゲームエンジンを作成しています。これらのスクリプトのほとんどはPygameを使用し、ユーザーがpygameを持っていない場合は

import os
os.system('pip install pygame')

残念ながら、私はどのようにユーザーのマシンにpipを取得するのかわからないので、これはpipを持っているユーザーに依存します。

0
X0FloH

1番目

> Download
> https://github.com/GeoNode/geonode-win-installer/blob/master/python_deps/pip-9.0.1-py2.py3-none-any.whl

2番目

extract .whl file and;  use winRar
copy extracted file and paste sitepackage [or python module container]

files are.. pip and pip-19.0.3.dist-info

3番目

import pip
pip.main(['install','scpy'])

scpy or any package you want to install
0
Eyasu

Sysモジュールを使ってうまくインストールできます

import sys
!{sys.executable} -m pip install <package> --user
0

インポート可能なpip-moduleは常に動くわけではないので、もっと堅牢な方法があります。

def PackageInstall(error):
    '''
    Finds out which package is missing and downloads it automatically after five seconds.

    Use example:

    try:
        import numpy as np
        import matplotlib.pyplot as plot

    except ImportError as error:
        PackageInstall(error)

    '''
    import time, subprocess, os, sys
    lib = str(error)[15:].replace('\'', '')
    print('>>>',str(error))
    print('>>> Download will start after five seconds')
    time.sleep(5)
    subprocess.call("pip install " + lib)

    print('>>> Restarting')
    os.startfile(__file__)
    sys.exit()

これはWindowsで動作します。

0
Ville