python多包运行_如何组织包含多个包的python项目,以便包中的每个文件仍然可以单独运行?...
TL;DR
如果您能讓它看起來像第二個項目組織圖,并且仍然可以運行以下命令,那么您已經回答了問題:$ git clone https://github.com/Poddster/package_problems.git
$ cd package_problems
$ nosetests
$ ./my_tool/my_tool.py
$ ./my_tool/t.py
$ ./my_tool/d.py
(or for the above commands, $ cd ./my_tool/ && ./my_tool.py is also acceptable)
或者:給我一個不同的項目結構,允許我將相關文件(“包”)組合在一起,單獨運行所有文件,將文件導入到同一包中的其他文件中,并將包/文件導入到其他包的文件中。
現狀
我有一堆python文件。當可以從命令行調用時,它們中的大多數都很有用,即它們都使用argparse和if __name__ == "__main__"來執行有用的操作。
目前我有這個目錄結構,一切正常:.
├── config.txt
├── docs/
│?? ├── ...
├── my_tool.py
├── a.py
├── b.py
├── c.py
├── d.py
├── e.py
├── README.md
├── tests
│?? ├── __init__.py
│?? ├── a.py
│ ? ├── b.py
│?? ├── c.py
│?? ├── d.py
│?? └── e.py
└── resources
├── ...
一些腳本import其他腳本中的內容來完成它們的工作。但是沒有一個腳本僅僅是一個庫,它們都是可調用的。e、 g.我可以調用./my_tool.py、./a.by、./b.py、./c.py等,它們會為用戶做一些有用的事情。
“my_tool.py”是利用所有其他腳本的主腳本。
我想發生的事
不過,我想改變項目的組織方式。這個項目本身代表了一個用戶可以使用的完整程序,并將作為一個整體進行分發,但是我知道它的一部分稍后將在不同的項目中有用,所以我想嘗試將當前文件封裝到一個包中。在不久的將來,我還將向這個項目添加其他包。
為了促進這一點,我決定將項目重新組織為如下內容:.
├── config.txt
├── docs/
│?? ├── ...
├── my_tool
│?? ├── __init__.py
│?? ├── my_tool.py
│?? ├── a.py
│?? ├── b.py
│?? ├── c.py
│?? ├── d.py
│?? ├── e.py
│?? └── tests
│?? ├── __init__.py
│?? ├── a.py
│?? ? ├── b.py
│?? ├── c.py
│?? ├── d.py
│?? └── e.py
├── package2
│?? ├── __init__.py
│?? ├── my_second_package.py
| ├── ...
├── README.md
└── resources
├── ...
但是,我無法找出滿足以下標準的項目組織:所有腳本都可以在命令行上調用(可以是my_tool\a.py或cd my_tool && a.py)
實際運行的測試:)
package2中的文件可以執行import my_tool
主要問題是包和測試使用的import語句。
目前,所有的包,包括測試,只需做import ,它就被正確地解析了。但是當擺弄周圍的東西時就不起作用了。
請注意,支持py2.7是一項要求,因此所有文件的頂部都有from __future__ import absolute_import, ...。
我所做的一切,以及災難性的后果
1個
如果我如上所示移動文件,但保留所有導入語句的當前狀態:$ ./my_tool/*.py工作正常,運行正常
$ nosetests從頂層目錄運行不起作用。測試無法導入包腳本。
pycharm在編輯這些文件時以紅色突出顯示導入語句:
2個
如果我將測試腳本更改為:from my_tool import x$ ./my_tool/*.py仍然可以工作,并且它們都正常運行
$ nosetests從頂層目錄運行不起作用。然后測試可以導入正確的腳本,但是當測試腳本導入腳本時,腳本中的導入本身會失敗。
pycharm仍然在主腳本中以紅色突出顯示導入語句:(
3個
如果我保持相同的結構,并將所有更改為from my_tool import,那么:$ ./my_tool/*.py導致ImportErrors
$ nosetests運行一切正常。
pycharm什么都不抱怨
例1:Traceback (most recent call last):
File "./my_tool/a.py", line 34, in
from my_tool import b
ImportError: cannot import name b
4個
我也嘗試過from . import x,但最終ValueError: Attempted relative import in non-package直接運行腳本。
看看其他的答案:
我不能用python -m pkg.tests.core_test作為
a)我沒有main.py。我想我可以吃一個嗎?
b) 我想能夠運行所有的腳本,而不僅僅是main?
我試過:if __name__ == '__main__' and __package__ is None:
from os import sys, path
sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))
但沒用。
我也試過:__package__ = "my_tool"
from . import b
但收到:SystemError: Parent module 'loading_tool' not loaded, cannot perform relative import
在from . import b之前添加import my_tool最后返回ImportError: cannot import name b
修理?
什么是正確的魔法咒語和目錄布局,使所有這些工作?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的python多包运行_如何组织包含多个包的python项目,以便包中的每个文件仍然可以单独运行?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python scrapy 环境搭建_p
- 下一篇: antd select 下拉菜单的 st