Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 测试Django命令文件或stdin_Python_Django_Django Commands - Fatal编程技术网

Python 测试Django命令文件或stdin

Python 测试Django命令文件或stdin,python,django,django-commands,Python,Django,Django Commands,我正在编写一个django命令,它接受大量输入并对其进行处理 由于数据量很大,输入应该以文件或stdin的形式输入,这似乎很自然 我想简单地测试它,我的意思是,不必在我的测试环境中创建一堆文件 现在,我记得在某个地方(找不到适当的文档,),应该从stdin读取“-”,但我无法让它工作 命令似乎应该执行以下操作: class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument(

我正在编写一个django命令,它接受大量输入并对其进行处理

由于数据量很大,输入应该以文件或stdin的形式输入,这似乎很自然

我想简单地测试它,我的意思是,不必在我的测试环境中创建一堆文件

现在,我记得在某个地方(找不到适当的文档,),应该从stdin读取“-”,但我无法让它工作

命令似乎应该执行以下操作:

class Command(BaseCommand):
    def add_arguments(self, parser):
        parser.add_argument("foo", type=file)

    def handle(self, *args, **options):
        file = options["foo"]
        # Then read the file, and process it
但是当我在命令行上运行命令时,它不喜欢
-
参数(表示它不是文件)

建议写入
self.stdout
,以便更好地进行测试。我为self.stdin尝试了类似的方法,但也无法实现

毫无疑问,这是一种常见的模式,但我找不到任何关于如何做到最好的帮助。似乎“应该有一种——最好只有一种——显而易见的方法来做”,但我找不到。有什么我遗漏的吗?

查看要添加参数的
type=
参数,它说“argparse模块提供工厂文件类型”

所以我做了下面的
/manage.py测试\u stdin-
然后按照您的预期工作

import argparse
类命令(BaseCommand):
def add_参数(self,解析器):
parser.add_参数(“foo”,type=argparse.FileType('r'))
def句柄(自身、*参数、**选项):
输入文件=选项[“foo”]
尽管如此:
line=input_file.readline()
如果len(line.strip())==0:
打破
其他:
self.stdout.write(“我刚读了%d个字符,第%s行”%(len(line),line))
查看添加参数的
type=
参数,它表示“argparse模块提供工厂文件类型”

所以我做了下面的
/manage.py测试\u stdin-
然后按照您的预期工作

import argparse
类命令(BaseCommand):
def add_参数(self,解析器):
parser.add_参数(“foo”,type=argparse.FileType('r'))
def句柄(自身、*参数、**选项):
输入文件=选项[“foo”]
尽管如此:
line=input_file.readline()
如果len(line.strip())==0:
打破
其他:
self.stdout.write(“我刚读了%d个字符,第%s行”%(len(line),line))

Django命令参数解析器是模块的包装。根据这篇文章:,您可以定义一个参数来接受
stdin
或一个实际文件作为输入

示例命令供您参考:

管理/命令/stdintest.py 您可以在不指定输入文件的情况下调用该命令,该命令将从stdin获取输入

$ python manage.py stdintest
1234
abcd     <- press ctrl+d to end stdin input
1234
abcd

我不确定你需要什么。如果我有误解,请留下评论。希望对您有所帮助。

Django命令参数解析器是模块的包装。根据这篇文章:,您可以定义一个参数来接受
stdin
或一个实际文件作为输入

示例命令供您参考:

管理/命令/stdintest.py 您可以在不指定输入文件的情况下调用该命令,该命令将从stdin获取输入

$ python manage.py stdintest
1234
abcd     <- press ctrl+d to end stdin input
1234
abcd

我不确定你需要什么。如果我有误解,请留下评论。希望能有所帮助。

如果可以解决问题,我会创建一组文件作为我的测试夹具。我不认为那样不好你是怎么写测试的?“-”?@Ming在哪里?我希望我的测试很简单,所以它们大部分都是只有一行的文件,甚至只有一个单词,而且必须查看文件中的内容似乎很烦人。通过单个项目的测试看起来更干净。@Ming我对“-”的测试是在命令行上运行的(编辑问题以更好地反映这一点),如果可以解决问题,我会创建一组文件作为测试夹具。我不认为那样不好你是怎么写测试的?“-”?@Ming在哪里?我希望我的测试很简单,所以它们大部分都是只有一行的文件,甚至只有一个单词,而且必须查看文件中的内容似乎很烦人。通过单个项目的测试看起来更简洁。@Ming我对“-”的测试是在命令行上运行的(编辑问题以更好地反映这一点),这非常有帮助,谢谢,但另一个答案比我要求的略多。这非常有帮助,谢谢,但另一个答案比我要求的略多。这很好。谢谢
argparse.FileType('r')
不是很直观。我(显然)希望得到更简单的东西,比如
文件
。谢谢。这是因为
文件
没有对“-”的特殊处理,而查看argparse的源代码时,如果string='-'则检查
,如果模式为“r”,则返回stdin。当您意识到“-”是可执行args中的约定而不是其他地方的约定时,这是有意义的。但是谢谢你的接受,这很有趣。这太棒了。谢谢
argparse.FileType('r')
不是很直观。我(显然)希望得到更简单的东西,比如
文件
。谢谢。这是因为
文件
没有对“-”的特殊处理,而查看argparse的源代码时,如果string='-'
则检查
,如果模式为“r”,则返回stdin。当您意识到“-”是可执行args中的约定而不是其他地方的约定时,这是有意义的。但是谢谢你的接受,解决这个问题很有趣。
$ echo '12345' > test.txt
$ python manage.py stdintest test.txt