python多包运行_如何组织包含多个包的python项目,以便包中的每个文件仍然可以单独运行?...
TL;DR
如果您能讓它看起來(lái)像第二個(gè)項(xiàng)目組織圖,并且仍然可以運(yùn)行以下命令,那么您已經(jīng)回答了問(wèn)題:$ 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)
或者:給我一個(gè)不同的項(xiàng)目結(jié)構(gòu),允許我將相關(guān)文件(“包”)組合在一起,單獨(dú)運(yùn)行所有文件,將文件導(dǎo)入到同一包中的其他文件中,并將包/文件導(dǎo)入到其他包的文件中。
現(xiàn)狀
我有一堆python文件。當(dāng)可以從命令行調(diào)用時(shí),它們中的大多數(shù)都很有用,即它們都使用argparse和if __name__ == "__main__"來(lái)執(zhí)行有用的操作。
目前我有這個(gè)目錄結(jié)構(gòu),一切正常:.
├── 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其他腳本中的內(nèi)容來(lái)完成它們的工作。但是沒(méi)有一個(gè)腳本僅僅是一個(gè)庫(kù),它們都是可調(diào)用的。e、 g.我可以調(diào)用./my_tool.py、./a.by、./b.py、./c.py等,它們會(huì)為用戶做一些有用的事情。
“my_tool.py”是利用所有其他腳本的主腳本。
我想發(fā)生的事
不過(guò),我想改變項(xiàng)目的組織方式。這個(gè)項(xiàng)目本身代表了一個(gè)用戶可以使用的完整程序,并將作為一個(gè)整體進(jìn)行分發(fā),但是我知道它的一部分稍后將在不同的項(xiàng)目中有用,所以我想嘗試將當(dāng)前文件封裝到一個(gè)包中。在不久的將來(lái),我還將向這個(gè)項(xiàng)目添加其他包。
為了促進(jìn)這一點(diǎn),我決定將項(xiàng)目重新組織為如下內(nèi)容:.
├── 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
├── ...
但是,我無(wú)法找出滿足以下標(biāo)準(zhǔn)的項(xiàng)目組織:所有腳本都可以在命令行上調(diào)用(可以是my_tool\a.py或cd my_tool && a.py)
實(shí)際運(yùn)行的測(cè)試:)
package2中的文件可以執(zhí)行import my_tool
主要問(wèn)題是包和測(cè)試使用的import語(yǔ)句。
目前,所有的包,包括測(cè)試,只需做import ,它就被正確地解析了。但是當(dāng)擺弄周?chē)臇|西時(shí)就不起作用了。
請(qǐng)注意,支持py2.7是一項(xiàng)要求,因此所有文件的頂部都有from __future__ import absolute_import, ...。
我所做的一切,以及災(zāi)難性的后果
1個(gè)
如果我如上所示移動(dòng)文件,但保留所有導(dǎo)入語(yǔ)句的當(dāng)前狀態(tài):$ ./my_tool/*.py工作正常,運(yùn)行正常
$ nosetests從頂層目錄運(yùn)行不起作用。測(cè)試無(wú)法導(dǎo)入包腳本。
pycharm在編輯這些文件時(shí)以紅色突出顯示導(dǎo)入語(yǔ)句:
2個(gè)
如果我將測(cè)試腳本更改為:from my_tool import x$ ./my_tool/*.py仍然可以工作,并且它們都正常運(yùn)行
$ nosetests從頂層目錄運(yùn)行不起作用。然后測(cè)試可以導(dǎo)入正確的腳本,但是當(dāng)測(cè)試腳本導(dǎo)入腳本時(shí),腳本中的導(dǎo)入本身會(huì)失敗。
pycharm仍然在主腳本中以紅色突出顯示導(dǎo)入語(yǔ)句:(
3個(gè)
如果我保持相同的結(jié)構(gòu),并將所有更改為from my_tool import,那么:$ ./my_tool/*.py導(dǎo)致ImportErrors
$ nosetests運(yùn)行一切正常。
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個(gè)
我也嘗試過(guò)from . import x,但最終ValueError: Attempted relative import in non-package直接運(yùn)行腳本。
看看其他的答案:
我不能用python -m pkg.tests.core_test作為
a)我沒(méi)有main.py。我想我可以吃一個(gè)嗎?
b) 我想能夠運(yùn)行所有的腳本,而不僅僅是main?
我試過(guò):if __name__ == '__main__' and __package__ is None:
from os import sys, path
sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))
但沒(méi)用。
我也試過(guò):__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
修理?
什么是正確的魔法咒語(yǔ)和目錄布局,使所有這些工作?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的python多包运行_如何组织包含多个包的python项目,以便包中的每个文件仍然可以单独运行?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python scrapy 环境搭建_p
- 下一篇: antd select 下拉菜单的 st