如何在python 3.6中使用绝对和相对导入?

时间:2017-12-01 17:50:47

标签: python python-3.x packages python-import

我有一个名为“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

1 个答案:

答案 0 :(得分:5)

当您使用__main__.py命令行开关时,程序包中的

-m模块使模块作为脚本运行。该开关采用模块名称,而不是路径,因此请删除./前缀:

python3 -m slingshot

当前工作目录被添加到模块搜索路径的开头,因此首先找到slingshot,不需要在此处给出相对路径规范。

来自-m switch documentation

  

sys.path搜索指定的模块,并将其内容作为__main__模块执行。

     

由于参数是模块名称,因此不得提供文件扩展名(.py)。模块名称应该是有效的绝对Python模块名称[。]

     

[...]

     

-c选项一样,当前目录将添加到sys.path的开头。