DjangoシェルからPythonスクリプトを実行する方法は?


247

DjangoシェルからPythonスクリプトを実行する必要があります。私は試した:

./manage.py shell << my_script.py

しかし、それはうまくいきませんでした。私が何かを書くのを待っていました。


これはどのようにdjango機能するのではなく、実際に何をしたいですか?
ダノドノバン2013年

2
my_script.pyDjangoモデルの1つに対するいくつかの操作が含まれています。私は以前にこれをすでに行いましたが、正確に思い出せません。

回答:


388

<<一部が間違っている、使用して<代わりに:

$ ./manage.py shell < myscript.py

あなたも行うことができます:

$ ./manage.py shell
...
>>> execfile('myscript.py')

python3の場合は、使用する必要があります

>>> exec(open('myscript.py').read())

17
私にとって、これはスクリプトの最初の行のみを実行します。働く唯一のことは、両方の方法を組み合わせている:./manage.py shell <<EOF\ execfile('myscript.py') \EOF
スティーブ・ベネット

Python 3以降では動作しません。これを置き換えるアイデアはありますか?
デビッドD.

4
@DavidD。交換は、この回答のここに
peter2108

11
Python 2.xと3.xの両方で機能するように見える別のソリューションはecho 'import myscript' | python manage.py shellです。これは、manage.pyコマンドを作成するという面倒なプロセスを実行する必要がなく、1度実行するだけの簡単なスクリプトに役立つことがわかりました。
Atul Varma

1
Windows power shellでこれを行っている場合: Get-Content myscript.py | .\manage.py shell
Aditya Wirayudha

219

shell- から行うことはお勧めしません。これは、django環境からランダムスクリプトを実際に実行するべきではないためです(ただし、これにいくつかの方法があります。他の回答を参照してください)。

これはあなたが複数回実行されることをスクリプトであれば、それはとしてそれを設定することをお勧めしますカスタムコマンドすなわち

 $ ./manage.py my_command

これを行うには、のサブディレクトリにファイルを作成managementし、commandsあなたのapp、すなわち

my_app/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            my_command.py
    tests.py
    views.py

このファイルでカスタムコマンドを定義します(ファイルの名前が実行元のコマンドの名前になるようにします./manage.py

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self, **options):
        # now do the things that you want with your models here

9
繰り返しますが、これが最良の答えです。django 1.8以降NoArgsCommandは非推奨です。このページには、作業例を示します:docs.djangoproject.com/en/1.9/howto/custom-management-commands/...
GER

2
以前のコメントのとおり、これが機能するためには、に変更def handle_noargs(self, **options):する必要がありましたdef handle(self, **options):
ジェームズ

この回答とドキュメントをサポートする興味深いリンクです
Mattia Paterna 2017年

1
動作させるにはdef handle(self, **options):、Jamesのコメントのように変更します。
Omar Gonzales

エレガントな答え。
どうも

103

Django 1.7以降を使用している人にとっては、設定モジュールをインポートするだけでは十分ではないようです。

少し掘り下げた後、私はこのスタックオーバーフローの答えを見つけました: https //stackoverflow.com/a/23241093

次のことを行う必要があります。

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...

上記を行わずに、私は得ていました django.core.exceptions.AppRegistryNoReadyエラーが発生しました。

私のスクリプトファイルは、djangoプロジェクトと同じディレクトリにあります(つまり、manage.pyと同じフォルダーにあります)。


2
私のセットアップには、DJANGO_SETTINGS_MODULE環境変数ですでに参照されている設定ファイルがあります。これで、import django ; django.setup()1.7未満で十分でした。
テイラーエドミストン2015年

1
django 1.7以降では、これは受け入れられる答えになるはずです:)
acidjunk

これは間違いなくDjango 1.9.xの正解です。実行しdjango.setup()ないと、スクリプトはDjangoモデルにアクセスできず、インポートもされません!
グラーレイン

virtualenvでは簡単にできますimport django; django.setup()
User3759685 2018年

1
あなたは私の日を作りました!この投稿をありがとう。私はmanagement.call_commandへのexecタスクにできなかったので、私はセロリにcreazyを得ていた:D:D:D

68

私はパーティーに遅れましたが、私の返答が誰かを助けることを願っています:これはPythonスクリプトで行うことができます:

import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings

残りの部分はここに移動します....


3
また、適切なsys.path.appendものをドロップできることにも注意してくださいDJANGO_SETTINGS_MODULES(たとえば、スクリプトがサイトルートのすぐ上にある場合は、実行できますos.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings')。
mgalgs 2014年

私がやってしまったsys.path.append(os.getcwd())私は私のプロジェクトのディレクトリ内だとき、それは動作しますが、私のDJANGO_SETTINGS_MODULEが正確であると私はその輸入モデル、ビューなどのスクリプトを実行しようと、
ダニーロカベヨ

そうですが、どこからでも実行することはできません。
e-nouri 2014

これは私にとってdjango 1.6では機能しません-私はアプリを持っています。djangoプロジェクトディレクトリを含めるようにパスを設定し、プロジェクト設定をセットアップしました。しかし、「from shoppinglist.models import ShoppingList」でアプリをインポートしようとすると、モデルが見つからないというエラーが表示されます。同じインポート行がmanage.pyシェル内から機能します。何か案は?
フランクスター、2015

33

runscriptdjango-extensionsから

python manage.py runscript scripty.py

script.pyそれをテストするサンプル:

from django.contrib.auth.models import User
print(User.objects.values())

http://django-extensions.readthedocs.io/en/latest/command_extensions.htmlで言及され、次の場所で文書化されています。

python manage.py runscript --help

チュートリアルもあります。

Django 1.9.6、django-extensions 1.6.7でテスト済み。


1
これは、既に使用している場合django-extensions(必要な場合)の最良の回答です。注:runscript標準のdjangoを使用しているように見えshellます。shell_plus単純なスクリプトのすべてをインポートする必要がなかったので(拡張機能でも)使用されていたら素晴らしいでしょう。
grokpot 2016

12

IPythonが使用可能な場合(pip install ipython./manage.py shellは自動的にそのシェルを使用し、次にmagicコマンドを使用できます%run

%run my_script.py

魅力のように働いた!
Roel、

これは、runscriptプロジェクト/パッケージ外のスクリプトで動作し、このように文句を言わないという利点がありますTypeError: the 'package' argument is required to perform a relative import for
smido

8

DJANGO_SETTINGS_MODULE環境変数を設定してスクリプトを実行するだけです。Djangoシェル環境をセットアップするために必要なのはこれだけです。

これはDjango> = 1.4で動作します


7

@AtulVarmaは、動作しない承認された回答の下で非常に役立つコメントを提供しました:

echo 'import myscript' | python manage.py shell

すばらしい答えです!私はコメントでそれを逃しました。ここに入れてくれてありがとう
Anupam


4

他の回答が示すが明示的には述べていないため、実際に必要なのは、Djangoシェルからスクリプトを実行する必要はなく、Djangoシェルを使用せずにアプリにアクセスすることです。

これは、DjangoのバージョンとDjangoのバージョンで大きく異なります。このスレッドで解決策が見つからない場合は、ここで回答してください 。manage.pyシェルを使用せずにモデルオブジェクトにアクセスするDjangoスクリプト または同様の検索が役立つ場合があります。

私はmy_command.pyを

import os,sys
sys.path.append('/path/to/myproject')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.file")
import django
django.setup()

import project.app.models
#do things with my models, yay

そして走った python3 my_command.py

(Django 2.0.2)


これはDjango 3.0でも機能します。私は交換しsys.path.append('/path/to/myproject')BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))`と` sys.path.append(BASE_DIR)。また、コマンドを実行する前に仮想環境をアクティブにすることを忘れないでください!
mrj

3
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

django.setup()

1
このコードが以前の非常によく似た回答のいくつかとは異なる方法で質問に回答する理由の説明を編集していただけませんか?コードのみの回答は、解決策を教えていないためお勧めできません。
Nathan Tuggy、2015

2

このメソッドは、djangoの最近のバージョンでは非推奨となっていることに注意してください。(> 1.3)

別の答えは、これを上に追加することです my_script.py

from django.core.management import setup_environ
import settings
setup_environ(settings)

my_script.pyあなたが持っているディレクトリでちょうどpythonで実行しますがsettings.py、これは少しハッキーです。

$ python my_script.py

1

BGでさらに実行したい場合:

nohup echo 'exec(open("my_script.py").read())' | python manage.py shell &

出力は nohup.out


0

面白いと思ったのはDjango Scriptsです。これを使用すると、python manage.py runscript foobarで実行するスクリプトを記述できます。実装と手順の詳細については、http: //django-extensions.readthedocs.org/en/latest/index.htmlをご覧ください。


0

仮想環境を使用している場合は、これを試してください:-

python manage.pyシェル

これらのコマンドを使用するには、仮想環境内にいる必要があります。この使用のため:-

workon vir_env_name

例えば ​​:-

dc@dc-comp-4:~/mysite$ workon jango
(jango)dc@dc-comp-4:~/mysite$ python manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

:-ここでmysiteは私のウェブサイト名で、jangoは私の仮想環境名です


0

OPと同じ質問でここに来ました、そして私は私のお気に入りの答えを正確に質問内の間違いに見つけました、それはPython 3でも機能します:

./manage.py shell <<EOF
import my_script
my_script.main()
EOF

0

他の方法では、これを実行します:

echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base

これはPython2.7とDjango1.9で動作しています


0

起動スクリプトを実行し(たとえば、いくつかのdjangoモデルをインポートしてインタラクティブに操作する)、djangoシェルにとどまる場合:

PYTHONSTARTUP=my_script.py python manage.py shell

0

djangoシェルは、django環境でpythonモジュールを実行するための良い方法ですが、モジュールをインポートして、特に自動補完なしで関数を手動で実行するのは、常に簡単で面倒なことではありません。これを解決するために、小さなシェルスクリプト「runscript.sh」を作成しましたに、Linuxコンソールのオートコンプリートとログ履歴を最大限に活用できる。

注意:runscript.shをルートプロジェクトにコピーし、実行権限を設定します(chmod + x)

例:myapp / do_folder /のモジュールdo_somethings.pyでshow(a、b、c)という名前のPython関数を実行したい

標準のdjangoの方法(manage.pyシェル):

python3 manage.py shell
 > from myapp.do_folder import do_somethings
 > do_somethings.show("p1", "p2"  , 3.14159)

スクリプトあり(runscript.sh):

./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159

スクリプトは引数の数に制限はありません。ただし、プリミティブ型の引数(int、float、string)のみがサポートされています


こんにちは、おそらくパッケージrunscriptからdjango-extensions同じことを行います。django
-extensions.readthedocs.io/ en / latest / runscript.htmlを

frost-nzcr4ありがとうございます。はい、確かに、この拡張機能は機能しますが、srciptsフォルダーとrun()関数のみに制限されていることがわかりました。私のsrciptを使用すると、任意のフォルダー内の任意の場所で関数を実行できます。
Martin13

0

パーティーに遅れました。しかし、これは誰かにとって役立つかもしれません。

必要なのはスクリプトとdjango-extensionsインストールだけです。

shell_plus利用可能なを実行し、django_extensions記述したスクリプトをインポートします。

スクリプトがscpt.pyフォルダー内にあるfol場合は、次のようにスクリプトを実行できます。

python manage.py shell_plus

次のように、シェル内にスクリプトをインポートします。

>>> from fol import scpt

-1

django.setup()が動作していないようです。

も必要ないようです。

これだけでうまくいきました。

import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")

1
django.setup()は、Django環境をブートストラップするために最も必要です。
colm.anseo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.