我想看看在python中确定当前脚本目录的最佳方法是什么?
我发现,由于调用python代码的方法很多,很难找到一个好的解决方案.
这是一些问题:
__file__如果脚本执行时未定义exec,execfile__module__ 仅在模块中定义用例:
./myfile.pypython myfile.py./somedir/myfile.pypython somedir/myfile.pyexecfile('myfile.py') (来自另一个脚本,可以位于另一个目录中,并且可以有另一个当前目录.我知道没有完美的解决方案,但我正在寻找解决大多数情况的最佳方法.
最常用的方法是os.path.dirname(os.path.abspath(__file__)),如果你从另一个脚本执行脚本,这实际上不起作用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
我有一个简单的脚本,它依赖于dnspython来解析区域文件.我想将此脚本作为单个.py分发,用户只要安装了2.6/2.7就可以运行.我不希望用户在站点范围内安装依赖项,因为可能存在与现有软件包/版本的冲突,我也不希望它们与virtualenv混在一起.我想知道是否有办法在脚本(gzip/base64)中嵌入像dnspython这样的包,并让该脚本在运行时访问该包.也许将它解压缩到/ tmp中的目录并将其添加到sys.path?我不关心启动开销,我只想要一个单独的.py w /包括我可以分发的所有依赖项.
此外,没有构建的C依赖项,只有纯python包.
编辑:脚本不必是.py.只要它是一个可执行文件.
在分发应用程序以将所有鸡蛋组合成单个zip文件时会很方便,这样您需要分发的只是一个zip文件和一个可执行文件(一些自定义二进制文件只需启动,加载zip文件的主要功能并踢出python关闭或类似).
我已经看过一些关于在线做这个的讨论,但没有关于如何实际做到这一点的例子.
我知道你可以(如果它的zip安全)将鸡蛋转换为zip文件.
我不确定的是:
你能以某种方式将所有鸡蛋合并成一个zip文件吗?如果是这样,怎么样?
你将如何加载和运行特定鸡蛋的代码?
你如何确保该蛋中的代码可以访问所有依赖项(即zip文件中的其他蛋)?
人们会问很多这样的东西并得到答案; 使用py2exe.是的,我明白了,这是一个解决方案.这不是我在这里问的问题......
我在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) 我已经将我的 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) 我一直在尝试编写一个程序来记录子进程的未捕获异常和语法错误。容易,对吧?只需将管道输送stderr到正确的位置即可。
然而,子进程是另一个 python 程序——我称之为test.py——需要运行,就好像它的输出/错误没有被捕获一样。也就是说,运行记录器程序需要看起来就像用户刚刚python test.py正常运行一样。
使问题进一步复杂化的是如果不使用则实际发送到的问题。不幸的是,我不能,因为我无法控制使用错误记录器运行的文件。raw_inputstderrreadlineimport readline
笔记:
pexpect或编辑这些*customize.py文件(因为该程序将由许多不同的用户运行)。我真的觉得无论如何应该有一个 stdlib 解决方案......我尝试过以下方法,但没有成功:
tee问题中的如何在使用带有管道的“tee”时将 stderr 写入文件?(未能产生raw_input提示);我在几个 SO 问题中发现的python 实现也tee有类似的问题sys.excepthook(无法使其适用于子进程)raw_input正确显示提示。我正在做一个小程序,我想用这个食谱分发它:
__main__.py在其中#!/usr/bin/env python问题是在这个包中我还有额外的文件(我使用pygtk工具包,我需要图像和ui xml文件).当我尝试访问这些文件时,我遇到资源不可用的错误(我尝试打开的路径类似于file.zip/gui/gui.ui).
我该如何处理这种情况?
找到我正在"执行"某些代码的文件路径的最简单方法是什么?通过这个,我的意思是,如果我有一个foo.py包含以下内容的文件:
print(here())
Run Code Online (Sandbox Code Playgroud)
我想看到/some/path/foo.py(我意识到在实践中什么文件是"正在执行"是复杂的,但我认为上面已经很好地定义了 - 一个包含一些函数的源文件,在执行时,它给出了所述文件的路径).
我过去需要这个来进行测试(需要一些外部文件)自包含,我现在想知道它是否是找到程序所需的一些支持文件的有用方法.但我从来没有找到一个很好的方法来做到这一点.检查模块听起来应该可以工作,但您似乎需要在该模块中定义的类或函数.
特别是,模块实例包含__file__属性,但我看不到如何获取"当前"模块.对象具有__module__属性,但这是模块名称,而不是模块实例.
我想一种方法是抛出并捕获异常并检查内容,但这似乎很难.当然,我错过了一种简单易行的方法吗?
python ×8
subprocess ×2
dirname ×1
file ×1
flask ×1
installation ×1
jinja2 ×1
packaging ×1
pypi ×1
python-3.x ×1
pythonpath ×1
setup.py ×1
stderr ×1
zipapp ×1