标签: sys

单元测试模块在脚本中时sys.argv [1]出现问题

我有一个脚本可以执行各种操作并使用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但它仍然厌倦了阅读额外的参数.

python unit-testing sys argv

11
推荐指数
2
解决办法
1万
查看次数

main中的python命令行参数,跳过脚本名称

这是我的剧本

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循环没有考虑到这一点,但我该怎么做呢?

python for-loop sys argv command-line-arguments

10
推荐指数
1
解决办法
2万
查看次数

你如何将python中的命令行参数转换为字典?

我正在编写一个带有任意命令行参数的应用程序,然后将它们传递给python函数:

$ myscript.py --arg1=1 --arg2=foobar --arg1=4
Run Code Online (Sandbox Code Playgroud)

然后在myscript.py里面:

import sys
argsdict = some_function(sys.argv)
Run Code Online (Sandbox Code Playgroud)

这里argsdict看起来是这样的:

{'arg1': ['1', '4'], 'arg2': 'foobar'}
Run Code Online (Sandbox Code Playgroud)

我确定某个地方有一个图书馆可以做到这一点,但我找不到任何东西.

编辑: argparse/getopt/optparse不是我想要的.这些库用于定义每次调用相同的接口.我需要能够处理任意参数.

除非,argparse/optparse/getopt具有执行此操作的功能......

python command-line sys argv

9
推荐指数
1
解决办法
1万
查看次数

Virtualenv,no-site-packages,sys.path

我的基本问题是我无法--no-site-packages"工作".

我已经阅读了SO上的一些帖子,包括这篇文章.我是一个巨大的Ubuntu noob,并且在python如何与os交互时并没有更好.

其他帖子建议printenv显示PYTHONPATH当我在我的virtualenv时,printenv似乎没有列出"PYTHONPATH",但很有可能我应该寻找的是一个dir我不知道的特殊而不是大写字母.

然而,我注意到,当我在virtualenv中运行python shell时,列出了我的所有全局包.

我不知道这是一个问题virtualenv,.bashrc,Ubuntumy brain.任何帮助将不胜感激.

如果那里有某种知识渊博的灵魂愿意在一个来回的过程中帮助我,我会非常感激.我没有列出我的任何输出,因为,老实说,除了上述之外,我不完全确定从哪里开始.

编辑以回应评论; UTC时间:2015年11月19日07:41

启动环境:

notanambiturner@computer:~/Dropbox/$$ P/...$ virtualenv --no-site-packages venv
New python executable in venv/bin/python
Installing setuptools, pip, wheel...done.
Run Code Online (Sandbox Code Playgroud)

进入环境:

notanambiturner@computer:~/Dropbox/$$ P/...$ source venv/bin/activate
(venv)notanambiturner@computer:~/Dropbox/$$ P/...$
Run Code Online (Sandbox Code Playgroud)

系统包:

(venv)notanambiturner@computer:~/Dropbox/$$ P/...$ pip freeze
adium-theme-ubuntu==0.3.4
apt-xapian-index==0.46
beautifulsoup4==4.4.1
bleach==1.4.2
blinker==1.3
cffi==1.1.2
characteristic==14.3.0
chardet==2.3.0
colorama==0.3.3
command-not-found==0.3
....
virtualenv==13.1.2
virtualenv-clone==0.2.6
virtualenvwrapper==4.7.1
wheel==0.26.0
whitenoise==1.0.6
xdiagnose==3.8.1
zope.interface==4.1.2
(venv)notanambiturner@computer:~/Dropbox/$$ P/...$ 
Run Code Online (Sandbox Code Playgroud)

sys.path:

(venv)notanambiturner@computer:~/Dropbox/$$ P/...$ …
Run Code Online (Sandbox Code Playgroud)

python ubuntu virtualenv sys pythonpath

9
推荐指数
1
解决办法
971
查看次数

AttributeError:模块'sys'没有属性'maxint'

我正在尝试使用Python 3.7运行以下代码:

import sys
print(sys.maxint)
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

D:\Python3.7\python.exe "D:/PyCharm 2017.2.3/Workplace/maximizer.py"
Traceback (most recent call last):
File "D:/PyCharm 2017.2.3/Workplace/maximizer.py", line 2, in <module>
    print(sys.maxint)
AttributeError: module 'sys' has no attribute 'maxint'
Run Code Online (Sandbox Code Playgroud)

我如何解决它?

python sys python-3.x

9
推荐指数
1
解决办法
1万
查看次数

sys.path.append("..") 有什么作用?

我在 python 脚本中遇到了这个语句:sys.path.append("..") 我做了一些研究,但我找不到它的作用。

我知道sys.path.append()函数在 PYTHONPATH 列表的末尾附加了一个路径。但代表什么".."

不用说,如果我注释该行,此 python 脚本将不起作用。

python sys python-3.x

9
推荐指数
1
解决办法
8975
查看次数

使用 argparser 将参数传递给入口点 python 脚本

我希望将用户输入的参数从命令行传递到 python 脚本的入口点。到目前为止,我尝试使用 argparse 将参数从命令行传递到 test.py 脚本。当我尝试传递参数时,它们无法被识别,并且收到以下错误。

load_entry_point('thesaurus==0.1', 'console_scripts', 'thesaurus')()
TypeError: find_synonym() 缺少 1 个必需的位置参数:'argv'

我在这里查看了其他示例,但无法使任何解决方案发挥作用。

def main(argv):
    if argv is None:
        argv = sys.argv

    parser = argparse.ArgumentParser(description='Enter string')
    parser.add_argument('string', type=str, help='Enter word or words', nargs='*')
    args = parser.parse_args(argv[1:])
    print(args)

if __name__ == "__main__":
    sys.exit(main(sys.argv))
Run Code Online (Sandbox Code Playgroud)

我的 setup.py 脚本入口点如下所示

setup(entry_points={'console_scripts': ['test=test_folder.main:main']})
Run Code Online (Sandbox Code Playgroud)

我期望发生的情况与我运行 python main.py main foo 时类似。当它传递给函数时,它将成功打印出 hello。

python arguments sys setup.py argparse

9
推荐指数
1
解决办法
4825
查看次数

安装在 Google Colab 中的 Google Drive 中的相对路径

我有一个 Google Colab 笔记本,我想将其分发给其他用户,并且我想在已安装的 Google Drive 中包含文件和目录的相对路径,以便代码在将其放在与当前目录不同的目录中时不会中断我有它。

具体来说,在 python 单元中,我希望能够编写一个类似的路径./demo/output/genomes/gbks而不是绝对路径/gdrive/My Drive/Github/cluster_identification/demo/output/genomes/gbks(因为笔记本本身包含在 中/gdrive/My Drive/Github/cluster_identification)。

我想知道我是否可以使用sys.path.append某种方式将笔记本路径添加到我的 python 路径中,但我不确定如何以不需要我在那里指定绝对路径的方式来做到这一点,即使我”我可以添加它,但我不确定在尝试在 python 单元格中定义路径时如何使用它。

我找到了这个答案(在 Google Colab 上获取笔记本的路径),它提供了一个线索,但它并没有完全解决我的问题,也不是一个非常强大的解决方案,因为它只有在笔记本的名称时才有效在 Google Drive 中是独一无二的。

在此先感谢您的帮助!

-抢

python path relative-path sys google-colaboratory

9
推荐指数
1
解决办法
2131
查看次数

Python:为什么`sys.exit(msg)`从一个线程调用不打印`msg`到stderr?

今天我反对这样一个事实,即sys.exit()从一个子线程调用并不会杀死主进程.我以前不知道这个,这没关系,但我需要很长时间才能意识到这一点.它本来可以节省很多时间,如果sys.exit(msg)打印msg的话stderr.但事实并非如此.

事实证明,这不是我的应用程序中的真正错误; 它sys.exit(msg)以一种有意义的错误调用了一个有意义的错误 - 但我只是看不到这一点.

在文档中sys.exit()说明: "[...]打印任何其他对象sys.stderr并导致退出代码为1"

对于来自子线程的调用,情况并非如此,其中sys.exit()显然表现为thread.exit(): "引发SystemExit异常.当未捕获时,这将导致线程以静默方式退出"

我认为当程序员想要sys.exit(msg)打印错误消息时,应该只打印它 - 独立于调用它的位置.为什么不?我目前看不出任何理由.至少在文档中应该有一个暗示,sys.exit()即消息不是从线程打印的.

你怎么看?为什么错误消息会隐藏在线程中?这有意义吗?

最好的祝福,

Jan-Philip Gehrcke

python multithreading exit sys

8
推荐指数
1
解决办法
1398
查看次数

将sys.stdout重定向到特定的Jupyter Notebook单元格

Jupyter == 4.1.0,Python == 2.7.10,IPython == 4.2.0

我正在为我的Jupyter笔记本编写一个SQL UI,并希望结合多线程,以便我可以在一个单元格中运行查询,并在查询运行时继续在其他单元格中工作.

我遇到的问题是,如果我在一个单元格中执行查询,输出将显示在最后执行的单元格的输出提示中,而不是在执行查询的单元格的输出提示中.

我仔细检查了网络,发现了这个聪明的伎俩,但我认为它已经过时了和/或在我的Jupyter版本中不再适用.当我运行它时,我只获得上次执行的任何单元格的输出.因此,如果我同时运行两者,我只获得最后执行的输出,而不是输出打印以同时分离单元格.

所以我有我的上下文管理器设置parent_header:

import sys
import threading
from contextlib import contextmanager

# we need a lock, so that other threads don't snatch control
# while we have set a temporary parent
stdout_lock = threading.Lock()

@contextmanager
def set_stdout_parent(parent):
    """a context manager for setting a particular parent for sys.stdout 
    the parent determines the destination cell of output
    """
    save_parent = sys.stdout.parent_header
    with stdout_lock:
        sys.stdout.parent_header = parent
        try:
            yield
        finally: …
Run Code Online (Sandbox Code Playgroud)

python ipython sys io-redirection jupyter-notebook

8
推荐指数
1
解决办法
1250
查看次数