diff options
| author | CoprDistGit <infra@openeuler.org> | 2023-05-10 05:20:59 +0000 |
|---|---|---|
| committer | CoprDistGit <infra@openeuler.org> | 2023-05-10 05:20:59 +0000 |
| commit | 86c7e365ec70fbe2bfefaed2cc58a2df714974a1 (patch) | |
| tree | f13d904a11e5b29f2ed4d3f4e674246d61e3c252 | |
| parent | 28e0223ecbf1acffea24b9e53325005ebd62e38e (diff) | |
automatic import of python-easytorchopeneuler20.03
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | python-easytorch.spec | 723 | ||||
| -rw-r--r-- | sources | 1 |
3 files changed, 725 insertions, 0 deletions
@@ -0,0 +1 @@ +/easytorch-3.7.6.tar.gz diff --git a/python-easytorch.spec b/python-easytorch.spec new file mode 100644 index 0000000..92956c4 --- /dev/null +++ b/python-easytorch.spec @@ -0,0 +1,723 @@ +%global _empty_manifest_terminate_build 0 +Name: python-easytorch +Version: 3.7.6 +Release: 1 +Summary: Easy Neural Network Experiments with pytorch +License: MIT +URL: https://github.com/sraashis/easytorch +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/89/21/59c36fb7e47db93bfd3966aa40c887a013e6f052a57f180006108a41ff9b/easytorch-3.7.6.tar.gz +BuildArch: noarch + + +%description +## A very lightweight framework on top of PyTorch with full functionality. + +#### **Just one way of doing things means no learning curve.** ✅ + + + + +[](https://github.com/sraashis/easytorch/actions) + + +<hr /> + +#### Installation + +1. `pip install --upgrade pip` +2. `Install latest pytorch and torchvision from` [Pytorch](https://pytorch.org/) +3. `pip install easytorch` + +* [MNIST](./examples/MNIST_easytorch_CNN.ipynb) [](https://colab.research.google.com/github//sraashis/easytorch/blob/master/examples/MNIST_easytorch_CNN.ipynb) +* [Retinal fundus image transfer learning tasks.](https://github.com/sraashis/retinal-fundus-transfer) +* [Covid-19 chest x-ray classification.](https://github.com/sraashis/covidxfactory) +* [DCGAN.](https://github.com/sraashis/gan-easytorch-celeb-faces) + +#### Let's start with something simple like MNIST digit classification: + +```python +from easytorch import EasyTorch, ETRunner, ConfusionMatrix, ETMeter +from torchvision import datasets, transforms +import torch.nn.functional as F +import torch +from examples.models import MNISTNet + +transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.1307,), (0.3081,)) +]) + + +class MNISTTrainer(ETRunner): + def _init_nn_model(self): + self.nn['model'] = MNISTNet() + + def iteration(self, batch): + inputs, labels = batch[0].to(self.device['gpu']).float(), batch[1].to(self.device['gpu']).long() + + out = self.nn['model'](inputs) + loss = F.nll_loss(out, labels) + _, pred = torch.max(out, 1) + + meter = self.new_meter() + meter.averages.add(loss.item(), len(inputs)) + meter.metrics['cfm'].add(pred, labels.float()) + + return {'loss': loss, 'meter': meter, 'predictions': pred} + + def init_experiment_cache(self): + self.cache['log_header'] = 'Loss|Accuracy,F1,Precision,Recall' + self.cache.update(monitor_metric='f1', metric_direction='maximize') + + def new_meter(self): + return ETMeter( + cfm=ConfusionMatrix(num_classes=10) + ) + + +if __name__ == "__main__": + train_dataset = datasets.MNIST('../data', train=True, download=True, transform=transform) + val_dataset = datasets.MNIST('../data', train=False, transform=transform) + + dataloader_args = {'train': {'dataset': train_dataset}, 'validation': {'dataset': val_dataset}} + runner = EasyTorch(phase='train', batch_size=512, + epochs=10, gpus=[0], dataloader_args=dataloader_args) + runner.run(MNISTTrainer) +``` + +### Run as: + +`python script.py -ph train -b 512 -e 10 -gpus 0` + +### ... with **20+** useful options. Check [here](./easytorch/config/) for full list. + +<hr /> + +## General use case: + +#### 1. Define your trainer + +```python +from easytorch import ETRunner, Prf1a, ETMeter, AUCROCMetrics + + +class MyTrainer(ETRunner): + + def _init_nn_model(self): + self.nn['model'] = NeuralNetModel(out_size=self.conf['num_class']) + + def iteration(self, batch): + """Handle a single batch""" + """Must have loss and meter""" + meter = self.new_meter() + ... + return {'loss': ..., 'meter': ..., 'predictions': ...} + + def new_meter(self): + return ETMeter( + num_averages=1, + prf1a=Prf1a(), + auc=AUCROCMetrics() + ) + + def init_cache(self): + """Will plot Loss in one plot, and Accuracy,F1_score in another.""" + self.cache['log_header'] = 'Loss|Accuracy,F1_score' + + """Model selection using validation set if present""" + self.cache.update(monitor_metric='f1', metric_direction='maximize') + +```` + +* Method new_meter() returns ETMeter that takes any implementation of easytorch.meter.ETMetrics. Provided ones: + * easytorch.metrics.Prf1a() for binary classification that computes accuracy,f1,precision,recall, overlap/IOU. + * easytorch.metrics.ConfusionMatrix(num_classes=...) for multiclass classification that also computes global + accuracy,f1,precision,recall. + * easytorch.metrics.AUCROCMetrics for binary ROC-AUC score. + +#### 2. Define specification for your datasets: + +* EasyTorch automatically splits the training data in _**data_source**_ as specified by + _**split_ratio(-spl or --split-ratio 0.7, 0.15, 0.15, for train validation and test portion)**_ OR Custom splits in + 1. Text files: + * data_source = "/some/path/*.txt", where it looks for 'train.txt', 'validation.txt', and 'test.txt' if phase is + _train_, and only 'test.txt' if phase is _test_ + 2. Json files: + * data_source = "some/path/split.json", where each split key has list of files as {'train': [], ' + validation' :[], 'test':[]} + 3. Just glob as data_source = "some/path/**/*.txt", must also provide split_ratio if phase = _train_ + +```python +from easytorch import ETDataset + + +class MyDataset(ETDataset): + def load_index(self, file): + """(Optional) Load/Process something and add to diskcache as: + self.diskcahe.add(file, value)""" + """This method runs in multiple processes by default""" + + self.indices.append([file, 'something_extra']) + + def __getitem__(self, index): + file = self.indices[index] + """(Optional) Retrieve from diskcache as self.diskcache.get(file)""" + + image = # Todo # Load file/Image. + label = # Todo # Load corresponding label. + + # Extra preprocessing, if needed. + # Apply transforms, if needed. + + return image, label +``` + +#### 3. Entry point (say main.py) +### Run as: + +`python main.py -ph train -b 512 -e 10 -gpus 0` + +One can also directly pass arguments as below which overrides all. +```python +from easytorch import EasyTorch + +runner = EasyTorch(phase="train", batch_size=4, epochs=10, + gpus=[0], num_channel=1, + num_class=2, data_source="<some_data>/data_split.json") +runner.run(MyTrainer, MyDataset) +``` + +### All the best! Cheers! 🎉 + +#### Cite the following papers if you use this library: + +``` +@article{deepdyn_10.3389/fcomp.2020.00035, + title = {Dynamic Deep Networks for Retinal Vessel Segmentation}, + author = {Khanal, Aashis and Estrada, Rolando}, + year = 2020, + journal = {Frontiers in Computer Science}, + volume = 2, + pages = 35, + doi = {10.3389/fcomp.2020.00035}, + issn = {2624-9898} +} + +@misc{2202.02382, + Author = {Aashis Khanal and Saeid Motevali and Rolando Estrada}, + Title = {Fully Automated Tree Topology Estimation and Artery-Vein Classification}, + Year = {2022}, + Eprint = {arXiv:2202.02382}, +} +``` + +### Feature Higlights: + +* DataHandle that is always available, and decoupled from other modules enabling easy + customization ([ETDataHandle](easytorch/data/data.py)). + * Use custom & complex data handling mechanism. +* Simple lightweight logger/plotter. + * **Plot:** set log_header = 'Loss,F1,Accuracy' to plot in same plot or set log_header = 'Loss|F1,Accuracy' to plot + Loss in one plot, and F1,Accuracy in another plot. + * **Logs:** all arguments/generated data will be saved in logs.json file after the experiment finishes. +* Gradient accumulation, automatic logging/plotting, model checkpointing, save everything. +* Multiple metrics implementation at easytorch.metrics: Precision, Recall, Accuracy, Overlap, F1, ROC-AUC, Confusion + matrix +* **For advanced training with multiple networks, and complex training steps, + click [here](assets/AdvancedTraining.md):** +* **Implement custom metrics as [here](assets/CustomMetrics.md).** + + + +%package -n python3-easytorch +Summary: Easy Neural Network Experiments with pytorch +Provides: python-easytorch +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-easytorch +## A very lightweight framework on top of PyTorch with full functionality. + +#### **Just one way of doing things means no learning curve.** ✅ + + + + +[](https://github.com/sraashis/easytorch/actions) + + +<hr /> + +#### Installation + +1. `pip install --upgrade pip` +2. `Install latest pytorch and torchvision from` [Pytorch](https://pytorch.org/) +3. `pip install easytorch` + +* [MNIST](./examples/MNIST_easytorch_CNN.ipynb) [](https://colab.research.google.com/github//sraashis/easytorch/blob/master/examples/MNIST_easytorch_CNN.ipynb) +* [Retinal fundus image transfer learning tasks.](https://github.com/sraashis/retinal-fundus-transfer) +* [Covid-19 chest x-ray classification.](https://github.com/sraashis/covidxfactory) +* [DCGAN.](https://github.com/sraashis/gan-easytorch-celeb-faces) + +#### Let's start with something simple like MNIST digit classification: + +```python +from easytorch import EasyTorch, ETRunner, ConfusionMatrix, ETMeter +from torchvision import datasets, transforms +import torch.nn.functional as F +import torch +from examples.models import MNISTNet + +transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.1307,), (0.3081,)) +]) + + +class MNISTTrainer(ETRunner): + def _init_nn_model(self): + self.nn['model'] = MNISTNet() + + def iteration(self, batch): + inputs, labels = batch[0].to(self.device['gpu']).float(), batch[1].to(self.device['gpu']).long() + + out = self.nn['model'](inputs) + loss = F.nll_loss(out, labels) + _, pred = torch.max(out, 1) + + meter = self.new_meter() + meter.averages.add(loss.item(), len(inputs)) + meter.metrics['cfm'].add(pred, labels.float()) + + return {'loss': loss, 'meter': meter, 'predictions': pred} + + def init_experiment_cache(self): + self.cache['log_header'] = 'Loss|Accuracy,F1,Precision,Recall' + self.cache.update(monitor_metric='f1', metric_direction='maximize') + + def new_meter(self): + return ETMeter( + cfm=ConfusionMatrix(num_classes=10) + ) + + +if __name__ == "__main__": + train_dataset = datasets.MNIST('../data', train=True, download=True, transform=transform) + val_dataset = datasets.MNIST('../data', train=False, transform=transform) + + dataloader_args = {'train': {'dataset': train_dataset}, 'validation': {'dataset': val_dataset}} + runner = EasyTorch(phase='train', batch_size=512, + epochs=10, gpus=[0], dataloader_args=dataloader_args) + runner.run(MNISTTrainer) +``` + +### Run as: + +`python script.py -ph train -b 512 -e 10 -gpus 0` + +### ... with **20+** useful options. Check [here](./easytorch/config/) for full list. + +<hr /> + +## General use case: + +#### 1. Define your trainer + +```python +from easytorch import ETRunner, Prf1a, ETMeter, AUCROCMetrics + + +class MyTrainer(ETRunner): + + def _init_nn_model(self): + self.nn['model'] = NeuralNetModel(out_size=self.conf['num_class']) + + def iteration(self, batch): + """Handle a single batch""" + """Must have loss and meter""" + meter = self.new_meter() + ... + return {'loss': ..., 'meter': ..., 'predictions': ...} + + def new_meter(self): + return ETMeter( + num_averages=1, + prf1a=Prf1a(), + auc=AUCROCMetrics() + ) + + def init_cache(self): + """Will plot Loss in one plot, and Accuracy,F1_score in another.""" + self.cache['log_header'] = 'Loss|Accuracy,F1_score' + + """Model selection using validation set if present""" + self.cache.update(monitor_metric='f1', metric_direction='maximize') + +```` + +* Method new_meter() returns ETMeter that takes any implementation of easytorch.meter.ETMetrics. Provided ones: + * easytorch.metrics.Prf1a() for binary classification that computes accuracy,f1,precision,recall, overlap/IOU. + * easytorch.metrics.ConfusionMatrix(num_classes=...) for multiclass classification that also computes global + accuracy,f1,precision,recall. + * easytorch.metrics.AUCROCMetrics for binary ROC-AUC score. + +#### 2. Define specification for your datasets: + +* EasyTorch automatically splits the training data in _**data_source**_ as specified by + _**split_ratio(-spl or --split-ratio 0.7, 0.15, 0.15, for train validation and test portion)**_ OR Custom splits in + 1. Text files: + * data_source = "/some/path/*.txt", where it looks for 'train.txt', 'validation.txt', and 'test.txt' if phase is + _train_, and only 'test.txt' if phase is _test_ + 2. Json files: + * data_source = "some/path/split.json", where each split key has list of files as {'train': [], ' + validation' :[], 'test':[]} + 3. Just glob as data_source = "some/path/**/*.txt", must also provide split_ratio if phase = _train_ + +```python +from easytorch import ETDataset + + +class MyDataset(ETDataset): + def load_index(self, file): + """(Optional) Load/Process something and add to diskcache as: + self.diskcahe.add(file, value)""" + """This method runs in multiple processes by default""" + + self.indices.append([file, 'something_extra']) + + def __getitem__(self, index): + file = self.indices[index] + """(Optional) Retrieve from diskcache as self.diskcache.get(file)""" + + image = # Todo # Load file/Image. + label = # Todo # Load corresponding label. + + # Extra preprocessing, if needed. + # Apply transforms, if needed. + + return image, label +``` + +#### 3. Entry point (say main.py) +### Run as: + +`python main.py -ph train -b 512 -e 10 -gpus 0` + +One can also directly pass arguments as below which overrides all. +```python +from easytorch import EasyTorch + +runner = EasyTorch(phase="train", batch_size=4, epochs=10, + gpus=[0], num_channel=1, + num_class=2, data_source="<some_data>/data_split.json") +runner.run(MyTrainer, MyDataset) +``` + +### All the best! Cheers! 🎉 + +#### Cite the following papers if you use this library: + +``` +@article{deepdyn_10.3389/fcomp.2020.00035, + title = {Dynamic Deep Networks for Retinal Vessel Segmentation}, + author = {Khanal, Aashis and Estrada, Rolando}, + year = 2020, + journal = {Frontiers in Computer Science}, + volume = 2, + pages = 35, + doi = {10.3389/fcomp.2020.00035}, + issn = {2624-9898} +} + +@misc{2202.02382, + Author = {Aashis Khanal and Saeid Motevali and Rolando Estrada}, + Title = {Fully Automated Tree Topology Estimation and Artery-Vein Classification}, + Year = {2022}, + Eprint = {arXiv:2202.02382}, +} +``` + +### Feature Higlights: + +* DataHandle that is always available, and decoupled from other modules enabling easy + customization ([ETDataHandle](easytorch/data/data.py)). + * Use custom & complex data handling mechanism. +* Simple lightweight logger/plotter. + * **Plot:** set log_header = 'Loss,F1,Accuracy' to plot in same plot or set log_header = 'Loss|F1,Accuracy' to plot + Loss in one plot, and F1,Accuracy in another plot. + * **Logs:** all arguments/generated data will be saved in logs.json file after the experiment finishes. +* Gradient accumulation, automatic logging/plotting, model checkpointing, save everything. +* Multiple metrics implementation at easytorch.metrics: Precision, Recall, Accuracy, Overlap, F1, ROC-AUC, Confusion + matrix +* **For advanced training with multiple networks, and complex training steps, + click [here](assets/AdvancedTraining.md):** +* **Implement custom metrics as [here](assets/CustomMetrics.md).** + + + +%package help +Summary: Development documents and examples for easytorch +Provides: python3-easytorch-doc +%description help +## A very lightweight framework on top of PyTorch with full functionality. + +#### **Just one way of doing things means no learning curve.** ✅ + + + + +[](https://github.com/sraashis/easytorch/actions) + + +<hr /> + +#### Installation + +1. `pip install --upgrade pip` +2. `Install latest pytorch and torchvision from` [Pytorch](https://pytorch.org/) +3. `pip install easytorch` + +* [MNIST](./examples/MNIST_easytorch_CNN.ipynb) [](https://colab.research.google.com/github//sraashis/easytorch/blob/master/examples/MNIST_easytorch_CNN.ipynb) +* [Retinal fundus image transfer learning tasks.](https://github.com/sraashis/retinal-fundus-transfer) +* [Covid-19 chest x-ray classification.](https://github.com/sraashis/covidxfactory) +* [DCGAN.](https://github.com/sraashis/gan-easytorch-celeb-faces) + +#### Let's start with something simple like MNIST digit classification: + +```python +from easytorch import EasyTorch, ETRunner, ConfusionMatrix, ETMeter +from torchvision import datasets, transforms +import torch.nn.functional as F +import torch +from examples.models import MNISTNet + +transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.1307,), (0.3081,)) +]) + + +class MNISTTrainer(ETRunner): + def _init_nn_model(self): + self.nn['model'] = MNISTNet() + + def iteration(self, batch): + inputs, labels = batch[0].to(self.device['gpu']).float(), batch[1].to(self.device['gpu']).long() + + out = self.nn['model'](inputs) + loss = F.nll_loss(out, labels) + _, pred = torch.max(out, 1) + + meter = self.new_meter() + meter.averages.add(loss.item(), len(inputs)) + meter.metrics['cfm'].add(pred, labels.float()) + + return {'loss': loss, 'meter': meter, 'predictions': pred} + + def init_experiment_cache(self): + self.cache['log_header'] = 'Loss|Accuracy,F1,Precision,Recall' + self.cache.update(monitor_metric='f1', metric_direction='maximize') + + def new_meter(self): + return ETMeter( + cfm=ConfusionMatrix(num_classes=10) + ) + + +if __name__ == "__main__": + train_dataset = datasets.MNIST('../data', train=True, download=True, transform=transform) + val_dataset = datasets.MNIST('../data', train=False, transform=transform) + + dataloader_args = {'train': {'dataset': train_dataset}, 'validation': {'dataset': val_dataset}} + runner = EasyTorch(phase='train', batch_size=512, + epochs=10, gpus=[0], dataloader_args=dataloader_args) + runner.run(MNISTTrainer) +``` + +### Run as: + +`python script.py -ph train -b 512 -e 10 -gpus 0` + +### ... with **20+** useful options. Check [here](./easytorch/config/) for full list. + +<hr /> + +## General use case: + +#### 1. Define your trainer + +```python +from easytorch import ETRunner, Prf1a, ETMeter, AUCROCMetrics + + +class MyTrainer(ETRunner): + + def _init_nn_model(self): + self.nn['model'] = NeuralNetModel(out_size=self.conf['num_class']) + + def iteration(self, batch): + """Handle a single batch""" + """Must have loss and meter""" + meter = self.new_meter() + ... + return {'loss': ..., 'meter': ..., 'predictions': ...} + + def new_meter(self): + return ETMeter( + num_averages=1, + prf1a=Prf1a(), + auc=AUCROCMetrics() + ) + + def init_cache(self): + """Will plot Loss in one plot, and Accuracy,F1_score in another.""" + self.cache['log_header'] = 'Loss|Accuracy,F1_score' + + """Model selection using validation set if present""" + self.cache.update(monitor_metric='f1', metric_direction='maximize') + +```` + +* Method new_meter() returns ETMeter that takes any implementation of easytorch.meter.ETMetrics. Provided ones: + * easytorch.metrics.Prf1a() for binary classification that computes accuracy,f1,precision,recall, overlap/IOU. + * easytorch.metrics.ConfusionMatrix(num_classes=...) for multiclass classification that also computes global + accuracy,f1,precision,recall. + * easytorch.metrics.AUCROCMetrics for binary ROC-AUC score. + +#### 2. Define specification for your datasets: + +* EasyTorch automatically splits the training data in _**data_source**_ as specified by + _**split_ratio(-spl or --split-ratio 0.7, 0.15, 0.15, for train validation and test portion)**_ OR Custom splits in + 1. Text files: + * data_source = "/some/path/*.txt", where it looks for 'train.txt', 'validation.txt', and 'test.txt' if phase is + _train_, and only 'test.txt' if phase is _test_ + 2. Json files: + * data_source = "some/path/split.json", where each split key has list of files as {'train': [], ' + validation' :[], 'test':[]} + 3. Just glob as data_source = "some/path/**/*.txt", must also provide split_ratio if phase = _train_ + +```python +from easytorch import ETDataset + + +class MyDataset(ETDataset): + def load_index(self, file): + """(Optional) Load/Process something and add to diskcache as: + self.diskcahe.add(file, value)""" + """This method runs in multiple processes by default""" + + self.indices.append([file, 'something_extra']) + + def __getitem__(self, index): + file = self.indices[index] + """(Optional) Retrieve from diskcache as self.diskcache.get(file)""" + + image = # Todo # Load file/Image. + label = # Todo # Load corresponding label. + + # Extra preprocessing, if needed. + # Apply transforms, if needed. + + return image, label +``` + +#### 3. Entry point (say main.py) +### Run as: + +`python main.py -ph train -b 512 -e 10 -gpus 0` + +One can also directly pass arguments as below which overrides all. +```python +from easytorch import EasyTorch + +runner = EasyTorch(phase="train", batch_size=4, epochs=10, + gpus=[0], num_channel=1, + num_class=2, data_source="<some_data>/data_split.json") +runner.run(MyTrainer, MyDataset) +``` + +### All the best! Cheers! 🎉 + +#### Cite the following papers if you use this library: + +``` +@article{deepdyn_10.3389/fcomp.2020.00035, + title = {Dynamic Deep Networks for Retinal Vessel Segmentation}, + author = {Khanal, Aashis and Estrada, Rolando}, + year = 2020, + journal = {Frontiers in Computer Science}, + volume = 2, + pages = 35, + doi = {10.3389/fcomp.2020.00035}, + issn = {2624-9898} +} + +@misc{2202.02382, + Author = {Aashis Khanal and Saeid Motevali and Rolando Estrada}, + Title = {Fully Automated Tree Topology Estimation and Artery-Vein Classification}, + Year = {2022}, + Eprint = {arXiv:2202.02382}, +} +``` + +### Feature Higlights: + +* DataHandle that is always available, and decoupled from other modules enabling easy + customization ([ETDataHandle](easytorch/data/data.py)). + * Use custom & complex data handling mechanism. +* Simple lightweight logger/plotter. + * **Plot:** set log_header = 'Loss,F1,Accuracy' to plot in same plot or set log_header = 'Loss|F1,Accuracy' to plot + Loss in one plot, and F1,Accuracy in another plot. + * **Logs:** all arguments/generated data will be saved in logs.json file after the experiment finishes. +* Gradient accumulation, automatic logging/plotting, model checkpointing, save everything. +* Multiple metrics implementation at easytorch.metrics: Precision, Recall, Accuracy, Overlap, F1, ROC-AUC, Confusion + matrix +* **For advanced training with multiple networks, and complex training steps, + click [here](assets/AdvancedTraining.md):** +* **Implement custom metrics as [here](assets/CustomMetrics.md).** + + + +%prep +%autosetup -n easytorch-3.7.6 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-easytorch -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Wed May 10 2023 Python_Bot <Python_Bot@openeuler.org> - 3.7.6-1 +- Package Spec generated @@ -0,0 +1 @@ +1e796023ea5af780bb99e9b5d6250caa easytorch-3.7.6.tar.gz |
