我是Python新手,我很难理解导入和路径位置,尤其是sys path
和PYTHONPATH
。
Python 3.6.2
我正试图在http/routes.py
中点击API路线,然后导入drivers/test_driver.py
,这样我就可以在其中运行函数。
ImportError:没有名为pandas的模块
使用Flask引导应用程序,在http://127.0.0.1:5000/
运行:
$ export FLASK_APP=http/routes
$ flask run
routes.py
import sys
import os
from flask import Flask, url_for
from drivers.test_driver import * ####### BREAKING
app = Flask(__name__)
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
@app.route('/')
def api_root():
return 'Welcome'
@app.route('/drivers')
def api_drivers():
# Do something with imported drivers functions
return 'All Drivers Ready'
if __name__ == '__main__':
app.run()
test_driver.py
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
print('Path: ', sys.path[len(sys.path)-1]) # '/Users/myname/Desktop/project/Lambda/drivers_app/drivers/..'
import pandas as pd
import boto as bt
def run():
df = pd.read_csv('s3 location', engine='python')
return 'this is working'
if __name__ == "__main__":
output = run()
print(output)
文件结构:
答案 0 :(得分:0)
我怀疑您未使用虚拟环境,配置不正确,或者您可能忘记在您运行flask run
的shell中激活它。 (开发Python项目时应始终使用虚拟环境;每个项目一个虚拟环境)。我不熟悉您所运行的操作系统的具体内容,因此我建议您阅读并遵循Hitchhiker's Guide to Python的前几部分。
如果你不确定你的shell是否激活了virtualenv,你可以随时which python
(或等同于windows的任何东西,如果这是你的东西)并且它应该打印一条路径你的virtualenvs所在的位置,而不是系统python。
在您进入某些高级用例之前,弄乱sys.path
是一个巨大的危险信号。你不应该这样做。我会将drivers
模块(module ==带有__init__.py
文件的文件夹)移动到http
模块(文件夹)中,所以你有
$ tree
.
└── http
├── drivers
│ ├── __init__.py
│ └── test_driver.py
├── __init__.py
└── routes.py
在routes.py
内,您使用相对导入并执行from .drivers.test_driver import run
(使用from whatever import *
通常被视为不良做法)。这应该可以减少混淆sys.path
的需要。