gpt4 book ai didi

python - 如何检查文件是否从Python中的另一个文件导入

转载 作者:行者123 更新时间:2023-12-03 17:08:19 27 4
gpt4 key购买 nike

假设我有这样的项目结构

src
└── app
├── main.py
├── db
│ └── database.py
├── models
│ ├── model_a.py
│ └── model_b.py
└── tests
├── test_x.py
└── test_y.py
我想检查哪个文件使用了 类(class) 功能 从另一个文件。我在 main.py 中有一个名为 Test 的类
class Test:
pass
我在 model_a 中使用了该类,
from ..main import Test
但是在 model_b我用了
from ..main import Test
from ..db.database import Data
我想检查哪个文件使用了另一个文件,就像 tree命令,只是一个文件夹名称就足够了,所以我尝试了一种旧方法,但它效率低下,很脏,这不是我所期望的。方法是我在 src 中创建了一个文件命名为 check.py ,我导入了所有包
from app.db import database
from app.models import model_a, model_b
from app.tests import test_x, test_y
from app import main

print('__file__={0:<35} | __name__={1:<20} | __package__={2:<20}'.format(__file__,__name__,str(__package__)))
我在所有文件的底部添加了这一行
print('__file__={0:<35} | __name__={1:<20} | __package__={2:<20}'.format(__file__,__name__,str(__package__)))
所以当我运行 check.py我得到这个结果
__file__=/home/yagiz/Desktop/struct/src/app/main.py | __name__=app.main             | __package__=app                 
__file__=/home/yagiz/Desktop/struct/src/app/db/database.py | __name__=app.db.database | __package__=app.db
__file__=/home/yagiz/Desktop/struct/src/app/models/model_a.py | __name__=app.models.model_a | __package__=app.models
__file__=/home/yagiz/Desktop/struct/src/app/models/model_b.py | __name__=app.models.model_b | __package__=app.models
__file__=/home/yagiz/Desktop/struct/src/app/tests/test_x.py | __name__=app.tests.test_x | __package__=app.tests
__file__=/home/yagiz/Desktop/struct/src/app/tests/test_y.py | __name__=app.tests.test_y | __package__=app.tests
__file__=/home/yagiz/Desktop/struct/src/check.py | __name__=__main__ | __package__=None
结果很脏,不符合我的期望有没有办法得到这样的输出?
main.py = app/models/model_a, app/models/model_b   # These files imports something from main.py
models_b = None # No file imports from models_b
更新,我尝试了@Hessam Korki 的建议 它不起作用 .
我查了 modulefinder的源代码我发现它在每个导入语句中添加了一个对我没有用的 badmodule。
这是怎么回事,首先我创建了一个函数,我还创建了另一个项目结构。
src
├── empty.py
├── __init__.py
├── main.py
├── module_finder.py
├── other
│   └── other.py
├── test
│   └── some_app.py
└── this_imports.py
这里是 module_finder.py包含我的功能
from modulefinder import ModuleFinder
file_names = ["this_imports.py", "main.py", "test/some_app.py", "other/other.py", "empty.py"]

def check_imports(file_names):
finder = ModuleFinder()
for file in file_names:
finder.run_script(file)
print("\n", file)
for name, mod in finder.modules.items():
print('%s: ' % name, end='')
print(','.join(list(mod.globalnames.keys())[:3]))

print('\n'.join(finder.badmodules.keys()))
空文件是 (如预期),在 main.py我有
class Test:
pass
this_imports.py我只有
from src.main import Test
other/other.py我有
from src.main import Test 
from src.test import DifferentTest
对于 test/some_app.py 中的最后一个我有
from src.main import Test

class DifferentTest:
pass
所以结果应该是:
empty.py = None
main.py = None
other/other.py = src.main , src.test
test/some_app.py = src.main
this_imports.py = src.main
但是该函数给出了错误的结果,这是输出:
 Filename:  this_imports.py
__main__: Test
src.main

Filename: main.py
__main__: Test,__module__,__qualname__
src.main

Filename: test/some_app.py
__main__: Test,__module__,__qualname__
src.main

Filename: other/other.py
__main__: Test,__module__,__qualname__
src.main
src.test

Filename: empty.py
__main__: Test,__module__,__qualname__
src.main
src.test

最佳答案

我相信python的Modulefinder将有效解决您的问题。 Modulefinder().items() 中有一个名为 '__main__' 的键,它保存在 python 文件中导入的模块。在您的项目中运行脚本并以适合您目的的方式存储数据后,您应该一切顺利

关于python - 如何检查文件是否从Python中的另一个文件导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63248354/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com