相关疑难解决方法(0)

如何正确确定当前脚本目录?

我想看看在python中确定当前脚本目录的最佳方法是什么?

我发现,由于调用python代码的方法很多,很难找到一个好的解决方案.

这是一些问题:

  • __file__如果脚本执行时未定义exec,execfile
  • __module__ 仅在模块中定义

用例:

  • ./myfile.py
  • python myfile.py
  • ./somedir/myfile.py
  • python somedir/myfile.py
  • execfile('myfile.py') (来自另一个脚本,可以位于另一个目录中,并且可以有另一个当前目录.

我知道没有完美的解决方案,但我正在寻找解决大多数情况的最佳方法.

最常用的方法是os.path.dirname(os.path.abspath(__file__)),如果你从另一个脚本执行脚本,这实际上不起作用exec().

警告

任何使用当前目录的解决方案都将失败,根据调用脚本的方式或者可以在运行的脚本中更改它,可能会有所不同.

python pythonpath dirname

229
推荐指数
8
解决办法
10万
查看次数

OSError:[Errno 8] Exec格式错误

我很难解析subprocess.Popen的参数.我正在尝试在我的Unix服务器上执行脚本.在shell提示符下运行时的脚本语法如下: /usr/local/bin/script hostname = <hostname> -p LONGLIST.无论我如何尝试,脚本都不在subprocess.Popen中运行

"="之前和之后的空格是强制性的.

import subprocess
Out = subprocess.Popen(['/usr/local/bin/script', 'hostname = ', 'actual server name', '-p', 'LONGLIST'],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)

以上不起作用.

当我使用shell = False时,我得到了 OSError: [Errno 8] Exec format error

python subprocess

36
推荐指数
3
解决办法
8万
查看次数

有没有办法在python脚本中嵌入依赖项?

我有一个简单的脚本,它依赖于dnspython来解析区域文件.我想将此脚本作为单个.py分发,用户只要安装了2.6/2.7就可以运行.我不希望用户在站点范围内安装依赖项,因为可能存在与现有软件包/版本的冲突,我也不希望它们与virtualenv混在一起.我想知道是否有办法在脚本(gzip/base64)中嵌入像dnspython这样的包,并让该脚本在运行时访问该包.也许将它解压缩到/ tmp中的目录并将其添加到sys.path?我不关心启动开销,我只想要一个单独的.py w /包括我可以分发的所有依赖项.

此外,没有构建的C依赖项,只有纯python包.

编辑:脚本不必是.py.只要它是一个可执行文件.

python

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

如何将所有python代码捆绑到一个zip文件中?

在分发应用程序以将所有鸡蛋组合成单个zip文件时会很方便,这样您需要分发的只是一个zip文件和一个可执行文件(一些自定义二进制文件只需启动,加载zip文件的主要功能并踢出python关闭或类似).

我已经看过一些关于在线做这个的讨论,但没有关于如何实际做到这一点的例子.

我知道你可以(如果它的zip安全)将鸡蛋转换为zip文件.

我不确定的是:

你能以某种方式将所有鸡蛋合并成一个zip文件吗?如果是这样,怎么样?

你将如何加载和运行特定鸡蛋的代码?

你如何确保该蛋中的代码可以访问所有依赖项(即zip文件中的其他蛋)?

人们会问很多这样的东西并得到答案; 使用py2exe.是的,我明白了,这是一个解决方案.这不是我在这里问的问题......

python pypi setup.py

23
推荐指数
3
解决办法
2万
查看次数

适用于Linux下的小型Python程序(非模块)的正确安装脚本

我在python中有一个小程序,它包含一个.py文件和一个程序使用的数据文件目录.

我想知道为Linux上具有管理员权限的用户创建安装过程的正确方法,以便他可以在他的系统上安装程序并从命令行使用它,包括选项和参数.编辑:我遇到问题的部分是让程序安装后检索包含在"数据"子文件夹中的数据文件.

安装可执行程序文件的安装脚本/usr/local/bin和数据文件夹/usr/share/my_program/data是否是可接受的解决方案?就像是:

#!/bin/bash
# Launch with sudo
chmod +x program.py
cp program.py /usr/local/bin
cp -r data /usr/share/my_program
echo Installation complete
Run Code Online (Sandbox Code Playgroud)

现在,为了做到这一点,我必须在程序中假设数据文件将进入/usr/share/my_program/data.但我也会让用户选择使用该程序而无需安装它.然后我将不得不假设数据相对于可执行程序文件是'./data'.我该如何解决这个问题?我可以想到几个方面,但我的感觉是,我正在创造一个应该有一个明确和正确答案的混乱.

目前,我正在考虑使用try except子句:

try:
    find data from /usr/share/my_program && set path accordingly
except:
    set path to the data as './data'
Run Code Online (Sandbox Code Playgroud)

再一次,我觉得这有点令人费解.你将如何进行安装?

非常感谢


编辑:解决方案已采用

根据这个问题的答案,以及FakeRainBrigand提出的问题(如何知道Python中运行脚本的路径?),我创建了一个如下所示的安装脚本:

#!/bin/bash
mkdir /usr/share/my_program
chmod +x my_program.py
cp my_program.py /usr/local/bin
cp -r data /usr/share/my_program
echo Installation completed
Run Code Online (Sandbox Code Playgroud)

并在我的程序中添加了以下代码:

if os.path.dirname(__file__) == "/usr/local/bin":
    DATA_PATH = "/usr/share/my_program/data"
elif os.path.dirname(__file__) …
Run Code Online (Sandbox Code Playgroud)

python installation

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

如何让 Flask/Jinja2 在可执行的 zip 存档中加载捆绑模板?

我已经将我的 Flask Web 应用程序打包到一个可执行的 Python 压缩档案 ( zipapp ) 中。我在加载模板时遇到问题。Flask/Jinja2 无法找到模板。

为了加载模板,我使用jinja2.FunctionLoader了一个加载函数,该函数应该能够从可执行 zip 存档内部读取捆绑文件(在本例中为 Jinja 模板)(参考:python:可执行 zip 文件可以包含数据文件吗?)。然而,加载函数无法找到模板(参见:(1)代码中),即使模板可以从加载函数外部读取(参见:(2)代码中)。

这是目录结构:

??? src
    ??? __main__.py
    ??? templates
        ??? index.html
        ??? __init__.py  # Empty file.
Run Code Online (Sandbox Code Playgroud)

src/__main__.py

import pkgutil
import jinja2
from flask import Flask, render_template


def load_template(name):
    # (1) ATTENTION: this produces an error. Why?
    # Error message:
    #   FileNotFoundError: [Errno 2] No such file or directory: 'myapp'
    data = pkgutil.get_data('templates', name)
    return data …
Run Code Online (Sandbox Code Playgroud)

python jinja2 flask zipapp

6
推荐指数
1
解决办法
722
查看次数

记录 python 子进程的语法错误和未捕获的异常并将其打印到终端

问题

我一直在尝试编写一个程序来记录子进程的未捕获异常和语法错误。容易,对吧?只需将管道输送stderr到正确的位置即可。

然而,子进程是另一个 python 程序——我称之为test.py——需要运行,就好像它的输出/错误没有被捕获一样。也就是说,运行记录器程序需要看起来就像用户刚刚python test.py正常运行一样。

使问题进一步复杂化的是如果不使用则实际发送到的问题不幸的是,我不能,因为我无法控制使用错误记录器运行的文件。raw_inputstderrreadlineimport readline

笔记:

  • 我对运行这段代码的机器有相当的限制。我无法安装pexpect或编辑这些*customize.py文件(因为该程序将由许多不同的用户运行)。我真的觉得无论如何应该有一个 stdlib 解决方案......
  • 这仅适用于 Macs。
  • 这样做的动机是我是研究新程序员所犯错误的团队的一员。

我尝试过的

我尝试过以下方法,但没有成功:

  • 只是使用tee问题中的如何在使用带有管道的“tee”时将 stderr 写入文件?(未能产生raw_input提示);我在几个 SO 问题中发现的python 实现也tee有类似的问题
  • 覆盖sys.excepthook(无法使其适用于子进程)
  • 这个问题的最佳答案似乎很有希望,但它未能raw_input正确显示提示。
  • 日志记录模块似乎对于实际写入日志文件很有用,但似乎没有解决问题的关键
  • 自定义 stderr 阅读器
  • 无休止的谷歌搜索

python subprocess stderr

5
推荐指数
1
解决办法
2452
查看次数

使用__main__.py分发可执行zip文件,如何访问额外数据?

我正在做一个小程序,我想用这个食谱分发它:

  1. 单目录__main__.py在其中
  2. 压缩此目录并在其上添加一个shebang #!/usr/bin/env python
  3. 让它可执行

问题是在这个包中我还有额外的文件(我使用pygtk工具包,我需要图像和ui xml文件).当我尝试访问这些文件时,我遇到资源不可用的错误(我尝试打开的路径类似于file.zip/gui/gui.ui).

我该如何处理这种情况?

python packaging

4
推荐指数
1
解决办法
1982
查看次数

如何在Python 3中找到"当前"源文件?

找到我正在"执行"某些代码的文件路径的最简单方法是什么?通过这个,我的意思是,如果我有一个foo.py包含以下内容的文件:

print(here())
Run Code Online (Sandbox Code Playgroud)

我想看到/some/path/foo.py(我意识到在实践中什么文件是"正在执行"是复杂的,但我认为上面已经很好地定义了 - 一个包含一些函数的源文件,在执行时,它给出了所述文件的路径).

我过去需要这个来进行测试(需要一些外部文件)自包含,我现在想知道它是否是找到程序所需的一些支持文件的有用方法.但我从来没有找到一个很好的方法来做到这一点.检查模块听起来应该可以工作,但您似乎需要在该模块中定义的类或函数.

特别是,模块实例包含__file__属性,但我看不到如何获取"当前"模块.对象具有__module__属性,但这是模块名称,而不是模块实例.

我想一种方法是抛出并捕获异常并检查内容,但这似乎很难.当然,我错过了一种简单易行的方法吗?

file python-3.x

4
推荐指数
1
解决办法
1626
查看次数