python - 为什么导入一个文件的函数时需要引入参数
问题描述
我有一个带有函数的程序(file1.py),我想从文件 test1.py 中测试这些函数。当我导入第一个函数时,我不知道为什么终端告诉我需要引入运行 file1.py 时所需的参数。我无法理解为什么会发生这种情况,因为据我从 test1.py 中知道,我正在使用第一个函数而不是完整的 file1.py。
file1.py(直到第一个函数)
import os
import argparse
import pandas as pd
import numpy as np
# Enter the path/file names
parser = argparse.ArgumentParser()
parser.add_argument('--vcf1', type=str, required=True)
parser.add_argument('--vcf2', type=str, required=True)
args = parser.parse_args()
NAME_FILE_1 = args.vcf1
NAME_FILE_2 = args.vcf2
def load_sample (Name_file):
'''
Take the header of the body of the CSV file
'''
with open(Name_file, 'r') as f:
for line in f:
if line.startswith('#') and len(line)>2 and line[1] != '#':
columns = line[1:-1].split('\t')
data = pd.read_csv(Name_file, comment='#', delimiter='\t', names=columns)
break
return data
# The data of the VCF is here
dataA = load_sample (NAME_FILE_1)
dataB = load_sample (NAME_FILE_2)
还有我的 test1.py
import os
import pandas as pd
import numpy as np
from VCF_matcher.app.run import load_sample
NAME_FILE_1 = "./test_sample.vcf"
# FIRST TEST
def test_load_sample():
'''Verify all rows of the body of the vcf file is taken'''
data_to_test = load_sample (NAME_FILE_1)
assert len(data_to_test) == 10425
输出:
======================================================== ERRORS ========================================================
_________________________________________ ERROR collecting test_vcf_matcher.py _________________________________________
test_vcf_matcher.py:13: in <module>
from VCF_matcher.app.run import load_sample
../app/run.py:26: in <module>
args = parser.parse_args()
../../../opt/anaconda3/lib/python3.8/argparse.py:1768: in parse_args
args, argv = self.parse_known_args(args, namespace)
../../../opt/anaconda3/lib/python3.8/argparse.py:1800: in parse_known_args
namespace, args = self._parse_known_args(args, namespace)
../../../opt/anaconda3/lib/python3.8/argparse.py:2034: in _parse_known_args
self.error(_('the following arguments are required: %s') %
../../../opt/anaconda3/lib/python3.8/argparse.py:2521: in error
self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
../../../opt/anaconda3/lib/python3.8/argparse.py:2508: in exit
_sys.exit(status)
E SystemExit: 2
--------------------------------------------------- Captured stderr ----------------------------------------------------
usage: pytest [-h] --vcf1 VCF1 --vcf2 VCF2
pytest: error: the following arguments are required: --vcf1, --vcf2
=============================================== short test summary info ================================================
ERROR test_vcf_matcher.py - SystemExit: 2
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
解决方案
file1.py
如果您不想每次从其他 Python 文件导入此文件时都运行“main”部分,则必须按如下结构:
import os
import argparse
import pandas as pd
import numpy as np
def load_sample (Name_file):
'''
Take the header of the body of the CSV file
'''
with open(Name_file, 'r') as f:
for line in f:
if line.startswith('#') and len(line)>2 and line[1] != '#':
columns = line[1:-1].split('\t')
data = pd.read_csv(Name_file, comment='#', delimiter='\t', names=columns)
break
return data
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--vcf1', type=str, required=True)
parser.add_argument('--vcf2', type=str, required=True)
args = parser.parse_args()
NAME_FILE_1 = args.vcf1
NAME_FILE_2 = args.vcf2
dataA = load_sample(NAME_FILE_1)
dataB = load_sample(NAME_FILE_2)
如需更好的解释,请参阅。
推荐阅读
- r - 读取具有随机数量空格的文件
- angular - Angular 12 HttpClient POST 到字符串无法编译
- matlab - 加载和绘制矩阵的 Matlab 错误
- javascript - 将属性从对象分配给 HTMLElement 的 es6/7 简写
- laravel - laravel voyager 多显示关系
- javascript - 使用 webpack 将 20 多个入口点转换为 1 个或几个
- node.js - POST 请求失败,无法登录
- wso2 - WSO2 身份服务器 - 如何以编程方式更新密码历史设置
- sails.js - Sails.JS 模型无法全局访问,即使 Globals.JS 包含模型:从 0.12 升级到 1.4.3 后的 true
- python - 从 Python 3 中的嵌套文件夹导入库