如果这些导入失败,请进入到合适的文件中解决模块导入问题,使其能够包括相对导入。例如,import fileparse 语句可以像下面这样进行修改:
# report.py from . import fileparse ...如果有类似于 from fileparse import parse_csv 这样的语句,请像下面这样修改代码:
# report.py from .fileparse import parse_csv ... 练习 9.2:创建应用目录对应用而言,将所有代码放到“包”中通常是不够的。有时,支持文件,文档,脚本等文件需要放到 porty/ 目录之外。
请创建一个名为 porty-app 的新目录。然后将我们在练习 9.1 中创建的 porty 目录移动到 porty-app 目录中。接着,复制测试文件 Data/portfolio.csv 和 Data/prices.csv 到 porty-app 目录。另外,在 porty-app 目录下创建一个 README.txt 文件,该文件包含一些有关自己的信息。现在,代码的组织结构像下面这样:
porty-app/ portfolio.csv prices.csv README.txt porty/ __init__.py fileparse.py follow.py pcost.py portfolio.py report.py stock.py tableformat.py ticker.py typedproperty.py要运行代码,需要确保你现在正在顶级目录 porty-app/ 下。例如,从终端运行:
shell % cd porty-app shell % python3 >>> import porty.report >>>尝试将之前的脚本作为主程序运行:
shell % cd porty-app shell % python3 -m porty.report portfolio.csv prices.csv txt Name Shares Price Change ---------- ---------- ---------- ---------- AA 100 9.22 -22.98 IBM 50 106.28 15.18 CAT 150 35.46 -47.98 MSFT 200 20.89 -30.34 GE 95 13.48 -26.89 MSFT 50 20.89 -44.21 IBM 100 106.28 35.84 shell % 练习 9.3:顶级脚本使用 python -m 命令通常有点怪异。可能需要编写一个顶级脚本来处理奇怪的包。请创建一个生成上述报告的脚本 print-report.py:
#!/usr/bin/env python3 # print-report.py import sys from porty.report import main main(sys.argv)然后把脚本 print-report.py 放到顶级目录 porty-app/ 中。并确保可以在 porty-app/ 目录下运行它:
shell % cd porty-app shell % python3 print-report.py portfolio.csv prices.csv txt Name Shares Price Change ---------- ---------- ---------- ---------- AA 100 9.22 -22.98 IBM 50 106.28 15.18 CAT 150 35.46 -47.98 MSFT 200 20.89 -30.34 GE 95 13.48 -26.89 MSFT 50 20.89 -44.21 IBM 100 106.28 35.84 shell %最后,代码的组织结构应该下面这样:
porty-app/ portfolio.csv prices.csv print-report.py README.txt porty/ __init__.py fileparse.py follow.py pcost.py portfolio.py report.py stock.py tableformat.py ticker.py typedproperty.py注:完整翻译见 https://github.com/codists/practical-python-zh