我有一个脚本可以执行各种操作并使用sys.argv访问参数,但是当脚本到达代码的unittest部分时,它说没有模块.我的脚本是:
class MyScript():
def __init__(self):
self.value = sys.argv[1]
def hello(self):
print self.value
def suite(self):
modules_to_test = ('external_sanity_onvif', 'starttest')
alltests = unittest.TestSuite()
for module in map(__import__, modules_to_test):
alltests.addTest(unittest.findTestCases(module))
return alltests
if __name__ == '__main__':
Run = MyScript()
Run.hello()
log_file = 'log_file.txt'
test_file = open(log_file, "w")
runner = unittest.TextTestRunner(test_file)
unittest.main(defaultTest='Run.suite', testRunner=runner)
Run Code Online (Sandbox Code Playgroud)
假设我./script.py Hello
在命令行中输入.我得到的错误是:
AttributeError: 'module' object has no attribute 'Hello'
Run Code Online (Sandbox Code Playgroud)
如果我删除unittest模块,它的工作原理.此外,如果我删除testrunner日志并将其保留在:
unittest.main(defaultTest='Run.suite')
Run Code Online (Sandbox Code Playgroud)
这仍然不起作用.
谁能帮忙.
谢谢
我试过这个黑客,但它仍然试图阅读sys.argv
.
project = sys.argv[4:]
sys.argv = sys.argv[0:4]
Run Code Online (Sandbox Code Playgroud)
我已经尝试了这一点,argv
但它仍然厌倦了阅读额外的参数.
我注意到Node定义了两者process.argv
和process.ARGV
(大写).文档中没有提到后者,并且在目前为止我遇到的每一种情况都是相同的对象.
是否ARGV
只是一个历史悠久的保持,或者它有一个目的?
以下Perl代码具有明显的低效率;
while (<>)
{
if ($ARGV =~ /\d+\.\d+\.\d+/) {next;}
... or do something useful
}
Run Code Online (Sandbox Code Playgroud)
代码将遍历我们不想要的文件的每一行.
关于这个特定脚本运行的文件的大小,这不太可能产生明显的差异,但是为了学习; 我怎么能破坏整个文件<>正在工作并转移到下一个?
这样做的目的是因为此脚本运行的服务器存储旧版本的应用程序,文件名中包含版本号,我只对当前版本感兴趣.
我碰巧有几个函数通过argv[]
数组访问程序的不同参数.现在,这些函数嵌套在main()
函数内部,因为编译器提供了允许这种结构的语言扩展.
我想摆脱嵌套函数,以便可以在不依赖语言扩展的情况下实现互操作性.
首先我想到了一个数组指针,我会argv[]
在程序启动时指向它,这个变量将在main()
函数之外并在函数之前声明,以便它们可以被它们使用.
所以我声明了如下指针:
char *(*name)[];
Run Code Online (Sandbox Code Playgroud)
哪个应该是指向字符指针数组的指针.但是,当我尝试将其指向时,argv[]
我会从不兼容的指针类型获得对赋值的警告:
name = &argv;
Run Code Online (Sandbox Code Playgroud)
可能是什么问题呢?你是否想过argv[]
从main()
函数外部访问数组的另一种方法?
我想在awk或cut命令中输入字符串名称(即"COL2")并打印与该列标题字符串匹配的列.
数据文件如下所示:
COL1 COL2 COL3 COL4 COL5 COL6
a a b d c f
a d g h e f
c v a s g a
Run Code Online (Sandbox Code Playgroud)
如果我传入COL3,我希望它打印第三列,等等.我认为awk可能是最容易使用的东西,但切割也可以.我只是不确定如何去做这件事.
是否可以执行argc = 0的进程?我需要执行一个程序,但它的argc等于0是非常重要的.有没有办法做到这一点?我试图在命令行中放置2 ^ 32个参数,使其看起来好像argc = 0但是参数个数有一个最大限制.
出于某种原因,我的C程序拒绝将argv的元素转换为int,我无法弄清楚原因.
int main(int argc, char *argv[])
{
fprintf(stdout, "%s\n", argv[1]);
//Make conversions to int
int bufferquesize = (int)argv[1] - '0';
fprintf(stdout, "%d\n", bufferquesize);
}
Run Code Online (Sandbox Code Playgroud)
这是运行./test 50时的输出:
50
-1076276207
我试过删除(int),抛出一个*和一个&之间(int)和argv [1] - 前者给了我一个5而不是50,但后者给了我一个类似于上面的输出.删除 - '0'操作没有多大帮助.我也尝试先制作一个char = argv [1]然后首先使用转换来进行转换,这很奇怪,不管输入如何都给了我一个17.
我非常困惑.到底是怎么回事?
我读了一篇文章(忘了URL),里面说的argv[argc]
是一个NULL
指针(包含\0
).要检查是否真的我写了这段代码,是的,它存在.我不明白的是,为什么操作系统包含此NULL
指针argv[argc]
.它对其他东西也有用吗?
int
main (int argc, char **argv){
while (*argv)
printf ("%s\n", *argv++);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 这是我的剧本
def main(argv):
if len(sys.argv)>1:
for x in sys.argv:
build(x)
if __name__ == "__main__":
main(sys.argv)
Run Code Online (Sandbox Code Playgroud)
所以从我写的命令行 python myscript.py commandlineargument
我希望它跳过myscript.py
和简单的运行commandlineargument
通过commandlineargument(n)
所以我明白我的for循环没有考虑到这一点,但我该怎么做呢?
我一直认为这argc
是标志结束的必要条件,argv
但我只是argv[argc] == NULL
按照定义学到了这一点.我认为这argc
完全是多余的吗?如果是这样,我一直认为C
以效率的名义取消冗余.我的假设是错误的还是背后的历史原因?如果原因是历史性的,你能详细说明吗?