我正在尝试在Linode实例上运行python setup.py
一个小脚本,我正在运行Flask + sqlalchemy(mysql)。
#filename - setup.py
from daaru import db
def init_db():
db.drop_all()
db.create_all()
init_db()
这是我得到的错误 -
Traceback (most recent call last):
File "setup.py", line 21, in <module>
init_db()
File "setup.py", line 9, in init_db
db.drop_all()
File "/home/captain/public/daaru/v1/local/lib/python2.7/site-packages/flask_sqlalchemy.py", line 830, in drop_all
self._execute_for_all_tables(app, bind, 'drop_all')
File "/home/captain/public/daaru/v1/local/lib/python2.7/site-packages/flask_sqlalchemy.py", line 814, in _execute_for_all_tables
op(bind=self.get_engine(app, bind), tables=tables)
File "/home/captain/public/daaru/v1/local/lib/python2.7/site-packages/flask_sqlalchemy.py", line 763, in get_engine
return connector.get_engine()
File "/home/captain/public/daaru/v1/local/lib/python2.7/site-packages/flask_sqlalchemy.py", line 443, in get_engine
self._engine = rv = sqlalchemy.create_engine(info, **options)
File "/home/captain/public/daaru/v1/local/lib/python2.7/site-packages/sqlalchemy/engine/__init__.py", line 338, in create_engine
return strategy.create(*args, **kwargs)
File "/home/captain/public/daaru/v1/local/lib/python2.7/site-packages/sqlalchemy/engine/strategies.py", line 64, in create
dbapi = dialect_cls.dbapi(**dbapi_args)
File "/home/captain/public/daaru/v1/local/lib/python2.7/site-packages/sqlalchemy/connectors/mysqldb.py", line 52, in dbapi
return __import__('MySQLdb')
ImportError: No module named MySQLdb
有趣的是,当我登录服务器时,激活虚拟环境(名为v1
),并在ipython中运行init_db
一切正常。但是当我将它作为脚本运行时,它为ImportError
模块提供MySQLdb
。 MySQLdb使用apt-get install python-mysqldb
进行系统范围的安装,因为此软件包不能通过pip获得。
我在这里做错了什么?
在服务器上运行pip freeze
向我显示:
Flask==0.9
Flask-SQLAlchemy==0.16
Jinja2==2.6
SQLAlchemy==0.7.9
Werkzeug==0.8.3
argparse==1.2.1
wsgiref==0.1.2
是否因为在venv中找不到mysqldb包而出现错误?为什么不使用该软件包的系统范围安装?
答案 0 :(得分:2)
我使用this博客文章在我的venv中安装mysql-python。现在一切都很有魅力。谢谢。 我还添加了一个fabfile来自动部署 -
from fabric.api import *
env.user = "host"
env.hosts = ["hostname"]
env.directory = "/home/captain/public/daaru"
env.activate = "source /home/captain/public/daaru/v1/bin/activate"
def deploy():
with cd(env.directory):
run("git pull")
run("sudo service apache2 reload")
def virtualenv(command):
with cd(env.directory), prefix(env.activate):
run(command)
def populate_db():
virtualenv("python setup.py")
def freeze():
""" command for testing virtualenv """
virtualenv("pip freeze")
答案 1 :(得分:0)
我刚刚碰到了这个问题,对我来说简单,肮脏的解决方法是cp -r /usr/lib/python2.7/dist-packages/*mysql* $VIRTUALENV/lib/python2.7/dist-packages/
和cp -r /usr/lib/python2.7/dist-packages/*MySQL* $VIRTUALENV/lib/python2.7/dist-packages/
,它们会选择所有需要的部分。
事实证明,由于pip install MySQL-python
没有通过apt安装,因此libmysqlclient-dev
在virtualenv中失败了。希望这会有所帮助。