我有一个名为“slingshot”的python项目/库,其目录结构如下:
import React from 'react';
import Main from '../layouts/Main';
import client from '../scripts/feathers-client';
const clientService = client.service('api/books');
export default class Books extends React.Component {
constructor (props) {
super(props);
if (this.props && this.props.books) {
this.state = {books: this.props.books};
} else {
this.obs = clientService.watch().find().subscribe(books => {
this.setState({books: books});
});
}
}
static async getInitialProps ({ req }) {
if (req) {
let service = req.app ? req.app.service('api/books') : {};
return { books: await service.find() };
} else {
return { books: ''};
}
}
componentWillUnmount () {
if (this.obs) {
this.obs.unsubscribe();
}
}
render () {
const renderBooks = this.state ?
<ol>
{this.state.books.data.map(book => (
<li key={book._id}>{book.author}, {book.title}, liked: {book.liked}<p>{book.synopsis}</p></li>
))}
</ol>
:
'';
return (
<Main>
<p>List of books :</p>
{renderBooks}
</Main>
);
}
}
从slingshot/
__init__.py
__main__.py
build.py
deploy.py
util/
__init__.py
prepare_env.py
cdn_api.py
开始,我想从__main__.py
导入函数。
我想确保util/prepare_env.py
引用我项目中的util
,而不是某些可能安装在其中的util
库。
我试过了util
但是我收到了错误。
from .util import prepare_env
似乎有效,但没有解决“util”的含糊不清。
我做错了什么?
from util import prepare_env
如下:
__main__.py
当我输入import os
from .util import prepare_env
if __name__ == '__main__':
if 'SLINGSHOT_INITIALIZED' not in os.environ:
prepare_env.pip_install_requirements()
prepare_env.stub_travis()
prepare_env.align_branches()
os.environ['SLINGSHOT_INITIALIZED'] = 'true'
时,我收到以下错误:
python3 ./slingshot
当我输入 File "./slingshot/__main__.py", line 2, in <module>
from .util import prepare_env
ImportError: attempted relative import with no known parent package
时,我收到以下错误:
python3 -m ./slingshot
答案 0 :(得分:5)
__main__.py
命令行开关时,程序包中的 -m
模块使模块作为脚本运行。该开关采用模块名称,而不是路径,因此请删除./
前缀:
python3 -m slingshot
当前工作目录被添加到模块搜索路径的开头,因此首先找到slingshot
,不需要在此处给出相对路径规范。
在
sys.path
搜索指定的模块,并将其内容作为__main__
模块执行。由于参数是模块名称,因此不得提供文件扩展名(
.py
)。模块名称应该是有效的绝对Python模块名称[。][...]
与
-c
选项一样,当前目录将添加到sys.path
的开头。