我正在尝试在一些独立的屏幕抓取脚本中使用Django ORM。我知道之前已经问过这个问题,但是我无法找到解决我特定问题的好方法。
我有一个定义模型的Django项目。我想要做的是在我的抓取脚本中使用这些模型和ORM。我的目录结构是这样的:
project
scrape
#scraping scripts
...
test.py
web
django_project
settings.py
...
#Django files
我尝试在project/scrape/test.py
中执行以下操作:
print os.path.join(os.path.abspath('..'), 'web', 'django_project')
sys.path.append(os.path.join(os.path.abspath('..'), 'web', 'django_project'))
print sys.path
print "-------"
os.environ['DJANGO_SETTINGS_MODULE'] = 'django_project.settings'
#print os.environ
from django_project.myapp.models import MyModel
print MyModel.objects.count()
但是,当我尝试运行test.py时,我得到ImportError
Traceback (most recent call last):
File "test.py", line 12, in <module>
from django_project.myapp.models import MyModel
ImportError: No module named django_project.myapp.models
我发现这个问题的一个解决方案是在scrape文件夹中创建一个指向../web/govcheck
的符号链接:
:scrape rmanocha$ ln -s ../web/govcheck ./govcheck
有了这个,我就可以运行test.py就好了。然而,这似乎是一个黑客,更重要的是,它不是非常便携(我必须在运行此代码的任何地方创建这个符号链接)。
所以,我想知道是否有人对我的问题有更好的解决方案?
答案 0 :(得分:7)
找到一种简单的方法来重用现有的django应用程序的控制台脚本设置:
from django.core.management import setup_environ
import settings
setup_environ(settings)
from myapp.models import Object
for o in Object.objects.all():
print o
答案 1 :(得分:2)
你确定它不应该是:
sys.path.append(os.path.join(os.path.abspath('..'), 'web'))
另外,请确保__init__.py
中有project/web/django_project
个文件(空可以)。
P.S。我建议将os.path.join
的输出提供给os.path.abspath
而不是其他方式。
答案 2 :(得分:0)
我知道这个问题已有六年了,但这个替代方案可能会吸引搜索此主题的人。假设Django的manage.py
位于project/
,假设main()
是脚本的入口点,那么让Django承担压力:
./manage.py shell -c 'from scrape.test import main; main()'